用两个关键字记录,分别为屌丝时间和女神时间
若屌丝约,更新屌丝时间
若女神约,更新屌丝和女神时间
学习,则两个全部清空
#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); else if (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); } } else if (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; }
时间: 2024-10-06 13:20:06