记录编号 |
449859 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[NOIP 2004]合唱队形 |
最终得分 |
100 |
用户昵称 |
JustWB |
是否通过 |
通过 |
代码语言 |
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;
}