zoj2451

来源:互联网 发布:网络信息管理岗位职责 编辑:程序博客网 时间:2024/05/20 20:17

题目大意:

有一个排序硬件叫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 <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#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(a<b){lch[now]=tot+1,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);elsemodify(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;}
0 0
原创粉丝点击