Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 41379 | Accepted: 12507 |
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
Source
题意:有一条线段,有O次操作,每次回给一段线段染色,每次查询一段线段的颜色种数
题解:开始不知道用什么去表示颜色的种数,查了题解才发现,要利用神奇的二进制,按位保存,因为颜色种数不超过30,使用int就可以保存啦,接下来就是线段树维护一下区间更新与查询就可以啦,这里顺便复习了一下bitset的函数。
reset()清空对象,所有位置为0
count()输出1的个数
#include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> #include<vector> #include<map> #include<set> #include<queue> #include<string> #include<bitset> #include<utility> #include<functional> #include<iomanip> #include<sstream> #include<ctime> using namespace std; #define N int(1e5) #define inf int(0x3f3f3f3f) #define mod int(1e9+7) typedef long long LL; #define lson L,mid,rt<<1 #define rson mid+1,R,rt<<1|1 #ifdef CDZSC #define debug(...) fprintf(stderr, __VA_ARGS__) #else #define debug(...) #endif struct segment { int lc,rc,add,va; int mid(){return (lc+rc)>>1;} }tree[N<<2]; bitset<40>ans; void pushup(int rt) { tree[rt].va=(tree[rt<<1].va|tree[rt<<1|1].va); } void pushdown(int rt) { if(tree[rt].add) { tree[rt<<1|1].va=tree[rt<<1].va=tree[rt].va; tree[rt<<1|1].add=tree[rt<<1].add=1; tree[rt].add=0; } } void build(int L,int R,int rt) { tree[rt].lc=L; tree[rt].rc=R; tree[rt].add=0; tree[rt].va=2; if(R==L) { return ; } int mid=tree[rt].mid(); build(lson); build(rson); } void update(int L,int R,int rt,int va) { if(tree[rt].lc==L&&tree[rt].rc==R) { tree[rt].va=(1<<va); tree[rt].add=1; return ; } pushdown(rt); int mid=tree[rt].mid(); if(R<=mid)update(L,R,rt<<1,va); else if(L>mid)update(L,R,rt<<1|1,va); else { update(lson,va); update(rson,va); } pushup(rt); } void query(int L,int R,int rt) { if(tree[rt].lc==L&&tree[rt].rc==R) { ans|=tree[rt].va; return ; } pushdown(rt); int mid=tree[rt].mid(); if(R<=mid)query(L,R,rt<<1); else if(L>mid)query(L,R,rt<<1|1); else { query(lson); query(rson); } } int main() { #ifdef CDZSC freopen("i.txt", "r", stdin); //freopen("o.txt","w",stdout); int _time_jc = clock(); #endif char s[10]; int n,m,t,x,y,z; while(~scanf("%d%d%d",&n,&t,&m)) { build(1,n,1); while(m--) { scanf("%s",s); if(s[0]=='C') { scanf("%d%d%d",&x,&y,&z); if(x>y)swap(x,y); update(x,y,1,z); } else { ans.reset(); scanf("%d%d",&x,&y); if(x>y)swap(x,y); query(x,y,1); printf("%d\n",ans.count()); } } } #ifdef CDZSC debug("time: %d\n", int(clock() - _time_jc)); #endif return 0; }