hdu1540
怎么会T啊
/* 三种操作:D x:第x个位置1 Q x:查询第x位置所在的0连续块 R :将上次D的位置置0 */ #include<iostream> #include<algorithm> #include<cstring> #include<cstdio> using namespace std; #define maxn 50050 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 int lmx[maxn<<2],rmx[maxn<<2],mx[maxn<<2]; int des[maxn],top; inline void pushup(int l,int r,int rt){ lmx[rt]=lmx[rt<<1]; rmx[rt]=rmx[rt<<1|1]; mx[rt]=max(mx[rt<<1],mx[rt<<1|1]); int m=l+r>>1; if(lmx[rt<<1]==m-l+1) lmx[rt]=m-l+1+lmx[rt<<1|1]; if(rmx[rt<<1|1]==r-l) rmx[rt]=r-m+rmx[rt<<1]; mx[rt]=max(mx[rt],rmx[rt<<1]+lmx[rt<<1|1]); } void build(int l,int r,int rt){ if(l==r){ lmx[rt]=rmx[rt]=mx[rt]=1; return; } int m=l+r>>1; build(lson); build(rson); pushup(l,r,rt); } void update(int pos,int c,int l,int r,int rt){ if(l==r){ lmx[rt]=rmx[rt]=mx[rt]=c; return; } int m=l+r>>1; if(pos<=m) update(pos,c,lson); else if(pos>m) update(pos,c,rson); pushup(l,r,rt); } int query(int pos,int l,int r,int rt){ if(mx[rt]==0 || l==r || mx[rt]==r-l+1) return mx[rt]; int m=l+r>>1; if(pos<=m){ if(pos>=m-rmx[rt<<1]+1) return query(pos,lson)+query(m+1,rson); else return query(pos,lson); } else { if(pos<=m+lmx[rt<<1|1]) return query(pos,rson)+query(m,lson); else return query(pos,rson); } } int main(){ int n,m; while(scanf("%d%d",&n,&m)!=EOF){ memset(des,0,sizeof des); top=0; build(1,n,1); char op[5]; int a,b; while(m--){ scanf("%s",op); if(op[0]=='D'){ scanf("%d",&a); update(a,0,1,n,1); des[top++]=a; } else if(op[0]=='Q'){ scanf("%d",&a); printf("%d\n",query(a,1,n,1)); } else { int tmp=des[--top]; update(tmp,1,1,n,1); } } } return 0; }
ac代码
/* 三种操作:D x:第x个位置1 Q x:查询第x位置所在的0连续块 R :将上次D的位置置0 */ #include<iostream> #include<algorithm> #include<cstring> #include<cstdio> using namespace std; #define maxn 50050 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 int lmx[maxn<<2],rmx[maxn<<2],mx[maxn<<2]; int des[maxn],top; inline void pushup(int l,int r,int rt){ lmx[rt]=lmx[rt<<1]; rmx[rt]=rmx[rt<<1|1]; mx[rt]=max(mx[rt<<1],mx[rt<<1|1]); int m=l+r>>1; if(lmx[rt<<1]==m-l+1) lmx[rt]=m-l+1+lmx[rt<<1|1]; if(rmx[rt<<1|1]==r-m) rmx[rt]=r-m+rmx[rt<<1]; mx[rt]=max(mx[rt],rmx[rt<<1]+lmx[rt<<1|1]); } void build(int l,int r,int rt){ if(l==r){ lmx[rt]=rmx[rt]=mx[rt]=1; return; } int m=l+r>>1; build(lson); build(rson); pushup(l,r,rt); } void update(int pos,int c,int l,int r,int rt){ if(l==r){ lmx[rt]=rmx[rt]=mx[rt]=c; return; } int m=l+r>>1; if(pos<=m) update(pos,c,lson); if(pos>m) update(pos,c,rson); pushup(l,r,rt); } int query(int pos,int l,int r,int rt){ if(mx[rt]==0 || l==r || mx[rt]==r-l+1) return mx[rt]; int m=l+r>>1; if(pos<=m){ if(pos+rmx[rt<<1]>m)//比之前优化了 return rmx[rt<<1]+lmx[rt<<1|1]; else return query(pos,lson); } else { if(m+lmx[rt<<1|1]>=pos)//比之前优化了 return rmx[rt<<1]+lmx[rt<<1|1]; else return query(pos,rson); } } int main(){ int n,m; while(scanf("%d%d",&n,&m)!=EOF){ memset(des,0,sizeof des); top=0; build(1,n,1); char op[5]; int a,b; while(m--){ scanf("%s",op); if(op[0]=='D'){ scanf("%d",&a); update(a,0,1,n,1); des[top++]=a; } else if(op[0]=='Q'){ scanf("%d",&a); printf("%d\n",query(a,1,n,1)); } else { int tmp=des[--top]; update(tmp,1,1,n,1); } } } return 0; }