HDU 4553 线段树双关键字区间合并

用两个关键字记录,分别为屌丝时间和女神时间

若屌丝约,更新屌丝时间

若女神约,更新屌丝和女神时间

学习,则两个全部清空

#include "stdio.h"#include "string.h"struct Data{int l,r,x1,x2,l1,l2,r1,r2;}data[400010];int Max(int a,int b){if (a<b) return b;else return a;}void build(int l,int r,int k){int mid;data[k].l=l;data[k].r=r;data[k].x1=data[k].l1=data[k].r1=r-l+1;data[k].x2=data[k].l2=data[k].r2=r-l+1;if (l==r) return ;mid=(l+r)/2;build(l,mid,k*2);build(mid+1,r,k*2+1);}int query(int x,int k,int op){if (op==1){if (data[k].x1<x) return 0;if (data[k].l1>=x) return data[k].l;if (data[k*2].x1>=x) return query(x,k*2,op);if (data[k*2].r1+data[k*2+1].l1>=x) return data[k*2].r-data[k*2].r1+1;return query(x,k*2+1,op);}if (op==2){if (data[k].x2<x) return 0;if (data[k].l2>=x) return data[k].l;if (data[k*2].x2>=x) return query(x,k*2,op);if (data[k*2].r2+data[k*2+1].l2>=x) return data[k*2].r-data[k*2].r2+1;return query(x,k*2+1,op);}}void Pushdown(int k){int ll,rr,sum;if (data[k].l==data[k].r) return ;ll=data[k*2].r-data[k*2].l+1;rr=data[k*2+1].r-data[k*2+1].l+1;sum=data[k].r-data[k].l+1;if (data[k].x1==0){data[k*2].x1=data[k*2].l1=data[k*2].r1=0;data[k*2+1].x1=data[k*2+1].l1=data[k*2+1].r1=0;}if (data[k].x1==sum){data[k*2].x1=data[k*2].l1=data[k*2].r1=ll;data[k*2+1].x1=data[k*2+1].l1=data[k*2+1].r1=rr;}if (data[k].x2==0){data[k*2].x2=data[k*2].l2=data[k*2].r2=0;data[k*2+1].x2=data[k*2+1].l2=data[k*2+1].r2=0;}if (data[k].x2==sum){data[k*2].x2=data[k*2].l2=data[k*2].r2=ll;data[k*2+1].x2=data[k*2+1].l2=data[k*2+1].r2=rr;}}void Pushup(int k){int ll,rr;ll=data[k*2].r-data[k*2].l+1;rr=data[k*2+1].r-data[k*2+1].l+1;data[k].l1=data[k*2].l1;if (data[k].l1==ll) data[k].l1+=data[k*2+1].l1;data[k].r1=data[k*2+1].r1;if (data[k].r1==rr) data[k].r1+=data[k*2].r1;data[k].x1=Max(Max(data[k*2].x1,data[k*2+1].x1),data[k*2].r1+data[k*2+1].l1);data[k].x1=Max(Max(data[k].l1,data[k].r1),data[k].x1);data[k].l2=data[k*2].l2;if (data[k].l2==ll) data[k].l2+=data[k*2+1].l2;data[k].r2=data[k*2+1].r2;if (data[k].r2==rr) data[k].r2+=data[k*2].r2;data[k].x2=Max(Max(data[k*2].x2,data[k*2+1].x2),data[k*2].r2+data[k*2+1].l2);data[k].x2=Max(Max(data[k].l2,data[k].r2),data[k].x2);}void updata(int l,int r,int k,int op){int mid,sum;if (data[k].l==l && data[k].r==r){sum=data[k].r-data[k].l+1;if (op==0){data[k].x1=data[k].l1=data[k].r1=sum;data[k].x2=data[k].l2=data[k].r2=sum;return ;}if (op==1){data[k].x1=data[k].l1=data[k].r1=0;return ;}if (op==2){data[k].x1=data[k].l1=data[k].r1=0;data[k].x2=data[k].l2=data[k].r2=0;return ;}}Pushdown(k);mid=(data[k].l+data[k].r)/2;if (r<=mid) updata(l,r,k*2,op);elseif (l>mid) updata(l,r,k*2+1,op);else{updata(l,mid,k*2,op);updata(mid+1,r,k*2+1,op);}Pushup(k);}int main(){int T,Case,x,y,start,n,m;char ch[10];scanf("%d",&T);Case=0;while (T–){Case++;printf("Case %d:\n",Case);scanf("%d%d",&n,&m);build(1,n,1);while (m–){scanf("%s",ch);if (ch[0]=='D'){scanf("%d",&x);start=query(x,1,1); // 询问是否有连续x的屌丝时间if (start==0)printf("fly with yourself\n");else{updata(start,start+x-1,1,1); // 从start开始连续x个,更新屌丝时间printf("%d,let's fly\n",start);}}elseif (ch[0]=='N'){scanf("%d",&x);start=query(x,1,1);if (start!=0){updata(start,start+x-1,1,2);printf("%d,don't put my gezi\n",start);continue;}start=query(x,1,2);// 询问是否有连续x的女神时间if (start!=0){updata(start,start+x-1,1,2); // 从start开始连续x个,,更新屌丝和女神时间printf("%d,don't put my gezi\n",start);continue;}printf("wait for me\n");}else{scanf("%d%d",&x,&y);updata(x,y,1,0); // 更新学习时间printf("I am the hope of chinese chengxuyuan!!\n");}}}return 0;}

开上一部车,装着我们的故事,

HDU 4553 线段树双关键字区间合并

相关文章:

你感兴趣的文章:

标签云: