Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
代码注释+坑点//题意:有T种颜色,T<=30,一段区间 //每次可以进行区间覆盖颜色或者询问某段区间不同的颜色个数 //因为T<=30,可以考虑状态压缩,在二进制中1代表有第i种颜色,0代表没有 //每次更新就相当于把该段状态 = 1<<i //每次询问只要把该段的左右区间或运算一下即可 #include <cstdio> #include <iostream> #include <cstring> #define MAXN 100050 using namespace std; int col[MAXN*4],tag[MAXN*4],n,t,m;//col[i]表示第i段的颜色状态 inline void push_up(int rt){col[rt] = col[rt<<1] | col[rt<<1|1];} //维护上一段的col inline void push_down(int rt){ if(tag[rt]){ int i = tag[rt]; col[rt<<1] = 1<<(i - 1); col[rt<<1|1] = 1<<(i - 1); tag[rt<<1] = tag[rt<<1|1] = i; tag[rt] = 0; } } inline void build(int rt, int l, int r){ if(l == r){ col[rt] = 1;//把颜色i看做是在二进制下1左移i-1位的结果,一开始是颜色1,所以col=1 return; } int mid = (l + r)>>1; build(rt<<1,l,mid); build(rt<<1|1,mid+1,r); push_up(rt);//记得更新 } inline void add(int rt,int L,int R,int i,int l, int r){ if(l >= L && r <= R){ col[rt] = 1<<(i-1); tag[rt] = i; return; }//遇到整段更新打标记 push_down(rt);//这边一定要pushdown,比如在区间X[1,4]有了一个tag,现在来到X,打算更新[3,4],如果不pushdown,等[3,4]更新完成,[1,4]的tag仍然存在 //下次询问来到X时,就会遇到X本不该存在的tag,push掉tag后,之前更新的[3,4]就会被tag覆盖,这样就会出现错误 int mid = (l + r)>>1; if(L <= mid) add(rt<<1,L,R,i,l,mid); if(R > mid) add(rt<<1|1,L,R,i,mid+1,r); push_up(rt); } inline int query(int rt, int L, int R, int l, int r){ if(l >= L && r <= R) return col[rt]; push_down(rt);//这边也一定要pushdown,理由如上 int mid = (l + r)>>1; int ans = 0; if(L <= mid) ans |= query(rt<<1,L,R,l,mid); if(R > mid) ans |= query(rt<<1|1,L,R,mid+1,r); return ans;//把状态并起来 } int main(){ cin>>n>>t>>m; build(1,1,n); for (int i = 1; i <= m; i++){ char opt; int l,r,x; cin>>opt; if(opt == 'C'){ cin>>l>>r>>x; if(l>r) swap(l,r);//这题坑的地方,L可能大于R add(1,l,r,x,1,n); } if(opt == 'P'){ cin>>l>>r; if(l>r) swap(l,r); int s = query(1,l,r,1,n); int ans = 0; for (int j = 0; j <= 30; j++) if((1<<j)&s) ++ans;//统计答案 cout<<ans<<endl; } } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator