标签:信息 bottom str connect cst its connected char span
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 7703 Accepted Submission(s):
2981
tr[x].l=tr[ls].l;
tr[x].r=tr[rs].r;
如果完整覆盖了左或右区间再做特殊处理
if(tr[x].l==mid-l+1) tr[x].l+=tr[rs].l;
if(tr[x].r==r-mid) tr[x].r+=tr[ls].r;
所以对于摧毁和恢复直接进行单点修改,将tr[x].l=tr[x].r=z(z为0或1)
对于询问,可以分别查询a向左的最长1串和a向右最长1串-1
特别的如果a已经被摧毁,则ans=-1
此时要做特判。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define ls x<<1 #define rs x<<1|1 const int N=50005; struct X { int l,r; }tr[N<<2]; int st[N]; void bu(int l,int r,int x) { if(l==r) tr[x].l=tr[x].r=1; else { int mid=l+(r-l)/2; bu(l,mid,ls); bu(mid+1,r,rs); tr[x].l=tr[x].r=r-l+1; } } void chan(int l,int r,int x,int w,int z) { if(l==r) tr[x].l=tr[x].r=z; else { int mid=l+(r-l)/2; if(w<=mid) chan(l,mid,ls,w,z); else chan(mid+1,r,rs,w,z); if(tr[x].l==mid-l+1) tr[x].l+=tr[rs].l; if(tr[x].r==r-mid) tr[x].r+=tr[ls].r; } } int ask1(int l,int r,int x,int w) { if(w==r) return tr[x].r; else { int mid=l+(r-l)/2,re; if(w>mid) { re=ask1(mid+1,r,rs,w); if(w-mid==re) re+=tr[ls].r; } else re=ask1(l,mid,ls,w); return re; } } int ask2(int l,int r,int x,int w) { if(w==l) return tr[x].l; else { int mid=l+(r-l)/2,re; if(w<=mid) { re=ask2(l,mid,ls,w); if(mid-w+1==re) re+=tr[rs].l; } else re=ask2(mid+1,r,rs,w); return re; } } int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { int s=0; memset(st,0,sizeof(st)); memset(tr,0,sizeof(tr)); bu(1,n,1); while(m--) { char c; scanf("\n%c",&c); if(c==‘D‘) { scanf("%d",&st[++s]); chan(1,n,1,st[s],0); } else if(c==‘R‘) chan(1,n,1,st[s--],1); else { int a,ans; scanf("%d",&a); ans=ask1(1,n,1,a)+ask2(1,n,1,a)-1; if(ans>0) printf("%d\n",ans); else printf("0\n"); } } } return 0; }
标签:信息 bottom str connect cst its connected char span
原文地址:http://www.cnblogs.com/bzmd/p/6224428.html