Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 35604 | Accepted: 10730 |
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
————————————————————————分割线——————————————
题目大意:
就是区间染色,初始的时候是颜色1,然后判断有多少种颜色
思路:
push_down,lazy标记
自己还是不是特清楚线段树的内涵。
在查询的时候原先是这样子的:
超时了。
void query(int L,int R,int l,int r,int rt) { if(L<=l&&r<=R){ if(cover[rt]!=-1) { if(!hash[cover[rt]]) cnt++; hash[cover[rt]]=true; return ; } } if(l==r) return; push_down(rt); int m=(l+r)>>1; if(L<=m) query(L,R,lson); if(m<R) query(L,R,rson); }
ac了
void query(int L,int R,int l,int r,int rt) { if(cover[rt]!=-1) { if(!hash[cover[rt]]) cnt++; hash[cover[rt]]=true; return ; } if(l==r) return; int m=(l+r)>>1; if(L<=m) query(L,R,lson); if(m<R) query(L,R,rson); }
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <utility> #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 const int maxn=100005; using namespace std; int cover[maxn<<2]; bool hash[31]; int cnt; void push_down(int rt) { if(cover[rt]!=-1) { cover[rt<<1]=cover[rt<<1|1]=cover[rt]; cover[rt]=-1; } } void build(int l,int r,int rt) { cover[rt]=1; if(l==r) return; int m=(l+r)>>1; build(lson); build(rson); } void update(int L,int R,int c,int l,int r,int rt) { if(L<=l&&r<=R) { cover[rt]=c; return ; } push_down(rt); int m=(l+r)>>1; if(L<=m) update(L,R,c,lson); if(m<R) update(L,R,c,rson); } void query(int L,int R,int l,int r,int rt) { if(cover[rt]!=-1) { if(!hash[cover[rt]]) cnt++; hash[cover[rt]]=true; return ; } if(l==r) return; int m=(l+r)>>1; if(L<=m) query(L,R,lson); if(m<R) query(L,R,rson); } int main() { build(1,maxn,1); int n,m,o; scanf("%d %d %d\n",&n,&m,&o); char op; int a,b,c; while(o--) { scanf("%c %d %d",&op,&a,&b); if(a>b) swap(a,b); if(op=='C') { scanf("%d",&c); update(a,b,c,1,maxn,1); } else { cnt=0; memset(hash,false,sizeof(hash)); query(a,b,1,maxn,1); printf("%d\n",cnt); } getchar(); } return 0; }