zoj2451

题目大意:

有一个排序硬件叫Maximizer。Maximizer通过管道方式完成Sorter(i[1], j[1]), …, Sorter(i[k], j[k])。每个sorter有N个输入和N个输出。Sorter(i,j)不下降排序i,i+1,…j。第N个sorter的输出是Maximizer的输出。
一个intern发现一些sorter可以排除在管道之外并且仍然产生正确的结果。那么问最短的长度是多少?

解题思路:

线段树,找时间研究一下

代码如下:

#include 
#include 
#include 
#include 
#define maxn 200015
#define maxm 500005
#define maxlongint (1<<30)
#define min(a,b) (((a)<(b))?(a):(b))
int lch[maxn],rch[maxn],l[maxn],r[maxn],w[maxn];
int n,m,tot;
int buildtree(int a,int b){
int now=++tot;
l[now]=a,r[now]=b,w[now]=maxlongint;
if(a1,buildtree(a,(a+b)/2);
rch[now]=tot+1,buildtree((a+b)/2+1,b);
}
return 0;
}
int modify(int t,int p,int f){
if(l[t]==r[t])
return w[t]=min(f,w[t]),0;
if(p<=r[lch[t]])
modify(lch[t],p,f);
else
modify(rch[t],p,f);
w[t]=min(w[lch[t]],w[rch[t]]);
return 0;
}
int query(int t,int a,int b){
if((l[t]>=a)&&(r[t]<=b))
return w[t];
int tmp1=maxlongint,tmp2=maxlongint;
if(r[lch[t]]>=a)
tmp1=query(lch[t],a,b);
if(l[rch[t]]<=b)
tmp2=query(rch[t],a,b);
return min(tmp1,tmp2);
}
int main(){
for(;scanf("%d%d",&n,&m)!=EOF;tot=0){
buildtree(1,n);
modify(1,1,0);
for(int a,b;m>0;m--){
scanf("%d%d",&a,&b);
modify(1,b,query(1,a,b-1)+1);
}
printf("%d\n",query(1,n,n));
}
return 0;
}

你可能感兴趣的:(zoj)