记录编号 449859 评测结果 AAAAAAAAAA
题目名称 [NOIP 2004]合唱队形 最终得分 100
用户昵称 GravatarJustWB 是否通过 通过
代码语言 C++ 运行时间 0.004 s
提交时间 2017-09-15 11:35:33 内存使用 1.46 MiB
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<algorithm>
#define mid ((L+R)>>1)
const int maxn=1e5+5;
using namespace std;
struct stree
{
	int v;
	stree *ls,*rs;
	stree(){v=0;ls=rs=NULL;}
}*ra,*rb;
inline int get();
void insert(stree *&now,int dis,int va,int L,int R);
int search(stree *now,int l,int r,int L,int R);
int n,ans=0x7ffff;
int N[maxn],mx;
int fa[maxn],fb[maxn];
int main()
{
	freopen("chorus.in","r",stdin);
	freopen("chorus.out","w",stdout);
	n=get();
	for(int i=1;i<=n;i++)
	{
		N[i]=get();
		mx=max(N[i],mx);
	}
	for(int i=1;i<=n;i++)
	{
		fa[i]=max(fa[i],search(ra,1,N[i]-1,1,mx)+1);
		insert(ra,N[i],fa[i],1,mx);
	}
	for(int i=n;i>=1;i--)
	{
		fb[i]=max(fb[i],search(rb,1,N[i]-1,1,mx)+1);
		insert(rb,N[i],fb[i],1,mx);
	}
	for(int i=1;i<=n;i++)ans=min(ans,n-fa[i]-fb[i]+1);
	printf("%d",ans);
	return 0;
}
int search(stree *now,int l,int r,int L,int R)
{
	if(!now) return 0;
	if(l==L&&r==R)return now->v;
	else if(r<=mid)return search(now->ls,l,r,L,mid);
	else if(l>mid)return search(now->rs,l,r,mid+1,R);
	else 
	{
		int a=0,b=0;
		if(now->ls)a=search(now->ls,l,mid,L,mid);
		if(now->rs)b=search(now->rs,mid+1,r,mid+1,R);
		return max(a,b);
	}
}
void insert(stree *&now,int dis,int va,int L,int R)
{
	if(!now)now=new stree();
	if(L==R)
	{
		now->v=max(now->v,va);
		return;
	}
	if(dis<=mid)insert(now->ls,dis,va,L,mid);
	else insert(now->rs,dis,va,mid+1,R);
	if(!now->ls)now->v=max(now->v,now->rs->v);
	else if(!now->rs)now->v=max(now->v,now->ls->v);
	else now->v=max(now->ls->v,now->rs->v);
}
inline int get()
{
	int t=0;char c=getchar(),j=1;
	while(!isdigit(c))
		if(c=='-')j=-1,c=getchar();
		else c=getchar();
	while(isdigit(c))
		t=(t<<3)+(t<<1)+c-'0',
		c=getchar();
	return j*t;
}