题意:也就是一个有限级问题,学习优先级最高,其次女神,屌丝最低
思路:分别设女神专属的标记与屌丝专属的标记去更新状态即可
#include <iostream> #include <cstdio> #include <algorithm> #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 using namespace std; const int N = 110010; struct node { int d, n, s; int l, r, m; int nsl, nsr, nsm; } tree[N<<2]; void study(int L,int R,int l,int r, int rt); void xuexi(int l,int r,int rt) { tree[rt].s=1,tree[rt].n=tree[rt].d=0; tree[rt].l=tree[rt].r=tree[rt].nsl=tree[rt].nsr=tree[rt].m=tree[rt].nsm=r-l+1; return ; } void diaosi(int l,int r,int rt) { tree[rt].d=1; tree[rt].l=tree[rt].r=tree[rt].m=0; return ; } void nvshen(int l,int r,int rt) { tree[rt].n=1, tree[rt].d=0; tree[rt].nsl=tree[rt].nsr=tree[rt].nsm=0; tree[rt].l=tree[rt].r=tree[rt].m=0; return ; } void pushdown(int l,int r,int rt) { int mid=(l+r)/2; if(tree[rt].s) { xuexi(lson); xuexi(rson); tree[rt].s=0; } if(tree[rt].d) { diaosi(lson); diaosi(rson); tree[rt].d=0; } if(tree[rt].n) { nvshen(lson); nvshen(rson); tree[rt].n=0; } return ; } void pushup(int l,int r,int rt) { int mid=(l+r)/2; tree[rt].m=max(tree[rt<<1].m,tree[rt<<1|1].m); tree[rt].m=max(tree[rt].m,tree[rt<<1].r+tree[rt<<1|1].l); tree[rt].l=tree[rt<<1].l,tree[rt].r=tree[rt<<1|1].r; if(tree[rt<<1].l==mid-l+1) { tree[rt].l+=tree[rt<<1|1].l; } if(tree[rt<<1|1].r==r-mid) { tree[rt].r+=tree[rt<<1].r; } tree[rt].nsm=max(tree[rt<<1].nsm,tree[rt<<1|1].nsm); tree[rt].nsm=max(tree[rt].nsm,tree[rt<<1].nsr+tree[rt<<1|1].nsl); tree[rt].nsl=tree[rt<<1].nsl,tree[rt].nsr=tree[rt<<1|1].nsr; if(tree[rt<<1].nsl==mid-l+1) { tree[rt].nsl+=tree[rt<<1|1].nsl; } if(tree[rt<<1|1].nsr==r-mid) { tree[rt].nsr+=tree[rt<<1].nsr; } return ; } int query(int flag,int time,int l,int r,int rt) { if(l==r) { return l; } pushdown(l,r,rt); int mid=(l+r)/2; if(!flag) { if(tree[rt<<1].m>=time) { return query(flag,time,lson); } else if(tree[rt<<1].r+tree[rt<<1|1].l>=time) { return mid-tree[rt<<1].r+1; } else { return query(flag,time,rson); } } else { if(tree[rt<<1].nsm>=time) { return query(flag,time,lson); } else if(tree[rt<<1].nsr+tree[rt<<1|1].nsl>=time) { return mid-tree[rt<<1].nsr+1; } else { return query(flag,time,rson); } } } void inset(int flag,int L,int R,int l,int r,int rt) { if(L==l&&R==r) { if(!flag) { diaosi(l,r,rt); } else { nvshen(l,r,rt); } return ; } int mid=(l+r)/2; pushdown(l,r,rt); if(R<=mid) { inset(flag,L,R,lson); } else if(L>mid) { inset(flag,L,R,rson); } else { inset(flag,L,mid,lson); inset(flag,mid+1,R,rson); } pushup(l, r, rt); return ; } int main() { int t, ncase=1; scanf("%d", &t); while(t--) { int n, q; scanf("%d %d", &n, &q); study(1,n,1,n,1); printf("Case %d:\n",ncase++); while(q--) { char str[20]; int time, l, r; scanf("%s",str); if(str[0]=='D') { scanf("%d", &time); if(tree[1].m<time) { printf("fly with yourself\n"); } else { int ans=query(0,time,1,n,1); inset(0,ans,ans+time-1,1,n,1); printf("%d,let's fly\n",ans); } } else if(str[0]=='N') { scanf("%d", &time); if(tree[1].m<time) { if(tree[1].nsm<time) { printf("wait for me\n"); } else { int ans=query(1,time,1,n,1); inset(1,ans,ans+time-1,1,n,1); printf("%d,don't put my gezi\n",ans); } } else { int ans=query(0,time,1,n,1); inset(1,ans,ans+time-1,1,n,1); printf("%d,don't put my gezi\n",ans); } } else { scanf("%d %d", &l, &r); study(l,r,1,n,1); printf("I am the hope of chinese chengxuyuan!!\n"); } } } return 0; } void study(int L,int R,int l,int r, int rt) { if(L==l&&R==r) { xuexi(l,r,rt); return ; } int mid=(l+r)/2; pushdown(l,r,rt); if(R<=mid) { study(L,R,lson); } else if(L>mid) { study(L,R,rson); } else { study(L,mid,lson); study(mid+1,R,rson); } pushup(l,r,rt); return ; }
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; const int L = 100000+10; struct node { int d,n,s; int ls,rs,ms;//屌丝标记 int nsl,nsr,nsm;//女神标记 } a[L<<2]; void diaosi(int l,int r,int i) { a[i].d = 1; a[i].ls = a[i].rs = a[i].ms = 0; } void nvshen(int l,int r,int i) { a[i].n = 1; a[i].d = 0; a[i].ls = a[i].rs = a[i].ms = 0; a[i].nsl = a[i].nsr = a[i].nsm = 0; } void xuexi(int l,int r,int i) { a[i].s = 1; a[i].d = a[i].n = 0; a[i].ls = a[i].rs = a[i].ms = r-l+1; a[i].nsl = a[i].nsr = a[i].nsm = r-l+1; } void pushup(int l,int r,int i) { int mid = (l+r)>>1; a[i].ms = max(a[2*i].ms,a[2*i+1].ms); a[i].ms = max(a[i].ms,a[2*i].rs+a[2*i+1].ls); a[i].ls = a[2*i].ls; a[i].rs = a[2*i+1].rs; if(a[2*i].ls == mid-l+1) a[i].ls+=a[2*i+1].ls; if(a[2*i+1].rs == r-mid) a[i].rs+= a[2*i].rs; a[i].nsm = max(a[2*i].nsm,a[2*i+1].nsm); a[i].nsm = max(a[i].nsm,a[2*i].nsr+a[2*i+1].nsl); a[i].nsl = a[2*i].nsl; a[i].nsr = a[2*i+1].nsr; if(a[2*i].nsl == mid-l+1) a[i].nsl+=a[2*i+1].nsl; if(a[2*i+1].nsr == r-mid) a[i].nsr+= a[2*i].nsr; } void pushdown(int l,int r,int i) { int mid = (l+r)>>1; if(a[i].s) { xuexi(l,mid,2*i); xuexi(mid+1,r,2*i+1); a[i].s = 0; } if(a[i].d) { diaosi(l,mid,2*i); diaosi(mid+1,r,2*i+1); a[i].d = 0; } if(a[i].n) { nvshen(l,mid,2*i); nvshen(mid+1,r,2*i+1); a[i].n = 0; } } void study(int L,int R,int l,int r,int i) { if(L == l && R == r) { xuexi(l,r,i); return ; } int mid = (l+r)>>1; pushdown(l,r,i); if(R<=mid) study(L,R,l,mid,2*i); else if(L>mid) study(L,R,mid+1,r,2*i+1); else { study(L,mid,l,mid,2*i); study(mid+1,R,mid+1,r,2*i+1); } pushup(l,r,i); } void insert(int flag,int L,int R,int l,int r,int i) { if(l == L && r == R) { if(!flag) diaosi(l,r,i); else nvshen(l,r,i); return ; } int mid = (l+r)>>1; pushdown(l,r,i); if(R<=mid) insert(flag,L,R,l,mid,2*i); else if(L>mid) insert(flag,L,R,mid+1,r,2*i+1); else { insert(flag,L,mid,l,mid,2*i); insert(flag,mid+1,R,mid+1,r,2*i+1); } pushup(l,r,i); } int query(int flag,int t,int l,int r,int i) { if(l==r) return l; int mid = (l+r)>>1; pushdown(l,r,i); if(!flag) { if(a[2*i].ms>=t) return query(flag,t,l,mid,2*i); else if(a[2*i].rs+a[2*i+1].ls>=t) return mid-a[2*i].rs+1; else return query(flag,t,mid+1,r,2*i+1); } else { if(a[2*i].nsm>=t) return query(flag,t,l,mid,2*i); else if(a[2*i].nsr+a[2*i+1].nsl>=t) return mid-a[2*i].nsr+1; else return query(flag,t,mid+1,r,2*i+1); } } int main() { int t,i,x,y,ans,cas = 1,n,m; char str[20]; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); printf("Case %d:\n",cas++); study(1,n,1,n,1); while(m--) { scanf("%s",str); if(str[0] == 'D') { scanf("%d",&x); if(a[1].ms<x)//线段树最大的区间都小于给定的时间就不用找了 printf("fly with yourself\n"); else { ans = query(0,x,1,n,1); insert(0,ans,ans+x-1,1,n,1); printf("%d,let's fly\n",ans); } } else if(str[0] == 'N') { scanf("%d",&x); if(a[1].ms<x) { if(a[1].nsm<x) printf("wait for me\n"); else { ans = query(1,x,1,n,1); insert(1,ans,ans+x-1,1,n,1); printf("%d,don't put my gezi\n",ans); } } else { ans = query(0,x,1,n,1); insert(1,ans,ans+x-1,1,n,1); printf("%d,don't put my gezi\n",ans); } } else { scanf("%d%d",&x,&y); study(x,y,1,n,1); printf("I am the hope of chinese chengxuyuan!!\n"); } } } return 0; }
