标签:
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 42828 | Accepted: 12973 |
Description
Input
Output
Sample Input
2 2 4 C 1 1 2 P 1 2 C 2 2 2 P 1 2
Sample Output
2 1
思路:因为只有30种颜色,所以可以用2进制数颜色。
注意:l可能大于r
#include <cstdio> #include <algorithm> using namespace std; const int MAXN=100005; typedef long long ll; struct Node{ ll color,lazy; int l,r; }a[MAXN*3]; int n,m; ll res; void pushUp(int rt) { a[rt].color=a[rt<<1].color | a[(rt<<1)|1].color; } void build(int rt,int l,int r) { a[rt].l=l; a[rt].r=r; a[rt].lazy=0; if(l==r) { a[rt].lazy=1; a[rt].color=1; return ; } int mid=(l+r)>>1; build(rt<<1,l,mid); build((rt<<1)|1,mid+1,r); pushUp(rt); } void pushDown(int rt) { if(a[rt].lazy!=0) { a[rt<<1].lazy=a[rt<<1].color=a[rt].color; a[(rt<<1)|1].lazy=a[(rt<<1)|1].color=a[rt].color; a[rt].lazy=0; } } void update(int rt,int l,int r,int val) { if(a[rt].l==l&&a[rt].r==r) { ll e=1; e<<=(val-1); a[rt].color=e; a[rt].lazy=e; return ; } pushDown(rt); int mid=(a[rt].l+a[rt].r)>>1; if(r<=mid) { update(rt<<1,l,r,val); } else if(mid<l) { update((rt<<1)|1,l,r,val); } else { update(rt<<1,l,mid,val); update((rt<<1)|1,mid+1,r,val); } pushUp(rt); } void query(int rt,int l,int r) { if(a[rt].l==l&&a[rt].r==r) { res=res|a[rt].color; return ; } pushDown(rt); int mid=(a[rt].l+a[rt].r)>>1; if(r<=mid) { query(rt<<1,l,r); } else if(mid<l) { query((rt<<1)|1,l,r); } else { query(rt<<1,l,mid); query((rt<<1)|1,mid+1,r); } } int main() { while(scanf("%d%*d%d",&n,&m)!=EOF) { build(1,1,n); for(int i=0;i<m;i++) { scanf("%*c"); char op; int l,r; scanf("%c %d %d",&op,&l,&r); if(l>r) swap(l,r); if(op==‘C‘) { int val; scanf("%d",&val); update(1,l,r,val); } else { res=0; query(1,l,r); int cnt=0; while(res>0) { if(res&1) cnt++; res>>=1; } printf("%d\n",cnt); } } } return 0; }
标签:
原文地址:http://www.cnblogs.com/program-ccc/p/5721405.html