Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 41391 | Accepted: 12511 |
二进制存储颜色,lazy思想;
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
POJ Monthly--2006.03.26,dodo
#include<cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <cmath> #include <queue> #include <stack> #include <set> #include <queue> #include <map> #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 using namespace std; const int N=1e5+10; int col[N<<2]; int Add[N<<2]; void build() { Add[1]=1; col[1]=1; } void pushup(int rt) { col[rt]=col[rt<<1]|col[rt<<1|1]; } void pushdown(int rt) { if(Add[rt]!=-1) { Add[rt<<1]=Add[rt<<1|1]=Add[rt]; col[rt<<1]=col[rt<<1|1]=Add[rt]; Add[rt]=-1; } } void update(int L,int R,int c,int l,int r,int rt) { if(L<=l&&R>=r) { Add[rt]=1<<(c-1); col[rt]=1<<(c-1); return; } if(L>r||R<l) return; pushdown(rt); int mid=(l+r)>>1; update(L,R,c,lson); update(L,R,c,rson); pushup(rt); } int Query(int L,int R,int l,int r,int rt) { if(L<=l&&R>=r) { return col[rt]; } if(L>r||R<l) return 0; pushdown(rt); int mid=(l+r)>>1; return Query(L,R,lson)|Query(L,R,rson); } int main() { int l,t,o; int a,b,c; char s[2]; scanf("%d%d%d",&l,&t,&o); build(); while(o--) { scanf("%s",s); if(s[0]=='C') { scanf("%d%d%d",&a,&b,&c); if(a>b) swap(a,b); update(a,b,c,1,l,1); } else { scanf("%d%d",&a,&b); if(a>b) swap(a,b); int tmp=Query(a,b,1,l,1); int ans=0; while(tmp) { if(tmp&1) ans++; tmp>>=1; } printf("%d\n",ans); } } return 0; }