本文共 1444 字,大约阅读时间需要 4 分钟。
偏移量要考虑清楚。
#includeusing namespace std;const int N=4e5+10;const int BASE=1e5+1;const int RIGHT=3e5+5e4;int segtree[N<<2],lazy[N<<2];void pushdown(int rt){ if (lazy[rt]) { lazy[rt<<1]=lazy[rt<<1|1]=1; segtree[rt<<1]=segtree[rt<<1|1]=0; lazy[rt]=0; }}void Update(int val,int l,int r,int rt){ if (l==r) { segtree[rt]++; return ; } pushdown(rt); int mid=(r+l)>>1; if (val<=mid) { Update(val,l,mid,rt<<1); } else { Update(val,mid+1,r,rt<<1|1); } segtree[rt]=segtree[rt<<1]+segtree[rt<<1|1];}void Delete(int L,int R,int l,int r,int rt){ if (L<=l&&r<=R) { lazy[rt]=1; segtree[rt]=0; return ; } pushdown(rt); int mid=(l+r)>>1; if (L<=mid) { Delete(L,R,l,mid,rt<<1); } if (mid >1; if (segtree[rt<<1]>=val) { return Query(val,l,mid,rt<<1); } else { return Query(val-segtree[rt<<1],mid+1,r,rt<<1|1); }}int main(){ char op[10]; int n,min_sal,tot=0,num,offset=0; scanf("%d%d",&n,&min_sal); for (int i=0;i =min_sal) { tot++; Update(num+BASE+offset,1,RIGHT,1); } } else if (!strcmp(op,"A")) { offset-=num; } else if (!strcmp(op,"S")) { offset+=num; Delete(1,BASE+min_sal-1+offset,1,RIGHT,1); } else { Delete(1,BASE+min_sal-1+offset,1,RIGHT,1); if (num>segtree[1]) { puts("-1"); } else { printf("%d\n",Query(segtree[1]-num+1,1,RIGHT,1)-BASE-offset); } } } printf("%d\n",tot-segtree[1]); return 0;}
转载地址:http://vruen.baihongyu.com/