Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3114 Accepted Submission(s): 846
#include"cstdio" #include"algorithm" using namespace std; const int MAXN=100005; struct Node{ int l,r; int color; int max,min; }a[MAXN*3]; void build(int rt,int l,int r) { a[rt].l=l; a[rt].r=r; if(l==r) { scanf("%d",&a[rt].color); a[rt].max=a[rt].color; a[rt].min=a[rt].color; return ; } int mid=(l+r)>>1; build(rt<<1,l,mid); build((rt<<1)|1,mid+1,r); if(a[rt<<1].color==a[(rt<<1)|1].color) a[rt].color=a[rt<<1].color; else a[rt].color=-1; a[rt].max=max(a[rt<<1].max,a[(rt<<1)|1].max); a[rt].min=min(a[rt<<1].min,a[(rt<<1)|1].min); } void update(int rt,int l,int r,int v) { if(a[rt].color==v) return ; if(a[rt].l==l&&a[rt].r==r) { a[rt].color=v; a[rt].max=v; a[rt].min=v; return ; } if(a[rt].color!=-1) { a[rt<<1].color=a[(rt<<1)|1].color=a[rt].color; a[rt<<1].max=a[(rt<<1)|1].max=a[rt].max; a[rt<<1].min=a[(rt<<1)|1].min=a[rt].min; } int mid=(a[rt].l+a[rt].r)>>1; if(r<=mid) update(rt<<1,l,r,v); else if(mid<l) update((rt<<1)|1,l,r,v); else{ update(rt<<1,l,mid,v); update((rt<<1)|1,mid+1,r,v); } if(a[rt<<1].color==a[(rt<<1)|1].color) a[rt].color=a[rt<<1].color; else a[rt].color=-1; a[rt].max=max(a[rt<<1].max,a[(rt<<1)|1].max); a[rt].min=min(a[rt<<1].min,a[(rt<<1)|1].min); } int cnt; void query(int rt,int l,int r,int c) { if(!(a[rt].min<=c&&c<=a[rt].max)) return ; if(a[rt].l==l&&a[rt].r==r&&a[rt].color!=-1) { if(a[rt].color==c) cnt+=(r-l+1); return ; } if(a[rt].l==a[rt].r) { if(a[rt].color==c) cnt++; return ; } if(a[rt].color!=-1) { a[rt<<1].color=a[(rt<<1)|1].color=a[rt].color; a[rt<<1].max=a[(rt<<1)|1].max=a[rt].max; a[rt<<1].min=a[(rt<<1)|1].min=a[rt].min; } int mid=(a[rt].l+a[rt].r)>>1; if(r<=mid) query(rt<<1,l,r,c); else if(mid<l) query((rt<<1)|1,l,r,c); else{ query(rt<<1,l,mid,c); query((rt<<1)|1,mid+1,r,c); } } int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { build(1,1,n); while(m--) { int op,l,r,c; scanf("%d%d%d%d",&op,&l,&r,&c); l++,r++; if(op==1) { update(1,l,r,c); } else { cnt=0; query(1,l,r,c); printf("%d\n",cnt); } } } return 0; }
原文:http://www.cnblogs.com/program-ccc/p/5142565.html