http://poj.org/problem?id=2777
跟贴报纸差不多,还不用离散化。
本身木棍的颜色是0,也算一种颜色,给木棍涂颜色,颜色用数字代替是1~30,不过是随时询问,不像贴报纸就问一次。
这个就要注意效率,用Lazy来延迟更新,登用到该值的时候再更新。
两种操作
C: L R color 从L到R区间长度的木棍全都涂上color(1~30)颜色,如果本来就有颜色就覆盖。
跟贴报纸差不多,还不用离散化。
本身木棍的颜色是0,也算一种颜色,给木棍涂颜色,颜色用数字代替是1~30,不过是随时询问,不像贴报纸就问一次。
这个就要注意效率,用Lazy来延迟更新,登用到该值的时候再更新。
两种操作
C: L R color 从L到R区间长度的木棍全都涂上color(1~30)颜色,如果本来就有颜色就覆盖。
Q: L R 从L到R区间长度上有多少种颜色。
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <deque>
#include <math.h>
#include <string>
#include <vector>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <functional>
#define mem(a) memset(a,0,sizeof(a));
#define mem_1(a) memset(a,-1,sizeof(a));
#define sf(a) scanf("%d",&a)
#define sff(a,b) scanf("%d%d",&a,&b)
#define sfff(a,b,c) scanf("%d%d%d",&a,&b,&c)
const int INF = 0x7FFFFFFF;
const int MAXN = 101000;
const double PI = acos(-1.0);
const double esp = 1e-10;
using namespace std;
struct node
{int l,r,lazy;int mid(){return (l+r)>>1;}
} Tree[MAXN<<4];
int ans = 0;
int flag[35];
void pushDown(int i)
{if(Tree[i].lazy != -1){Tree[i << 1].lazy = Tree[i].lazy;Tree[i<<1|1].lazy = Tree[i].lazy;Tree[i].lazy = -1;}
}
void build_tree(int l,int r,int i)
{Tree[i].l = l;Tree[i].r = r;Tree[i].lazy = 1;if(r == l){return ;}int mid = (l+r)>>1;build_tree(l,mid,i<<1);build_tree(mid+1,r,i<<1|1);
}
void updata(int l,int r,int i,int k)
{if(Tree[i].l == l && Tree[i].r == r){Tree[i].lazy = k;return ;}if(Tree[i].lazy == k) return ;pushDown(i);int mid = Tree[i].mid();if(r <= mid) updata(l,r,i<<1,k);else if(mid < l) updata(l,r,i<<1|1,k);else{updata(l,mid,i<<1,k);updata(mid+1,r,i<<1|1,k);}
}
void Query(int l,int r,int i)
{//if(Tree[i].l == r && Tree[i].r == r && Tree[i].lazy)if(Tree[i].lazy != -1){if(!flag[Tree[i].lazy]){flag[Tree[i].lazy] = 1;ans++;}return ;}pushDown(i);int mid = Tree[i].mid();if(r <= mid) Query(l,r,i<<1);else if(mid < l) Query(l,r,i<<1|1);else {Query(l,mid,i<<1);Query(mid+1,r,i<<1|1);}
}
int main()
{int n,colorNum,m;int l,r,color;char c;while(sfff(n,colorNum,m)!=EOF){build_tree(1,n,1);while(m--){cin >> c;if(c=='C'){sfff(l,r,color);if(l > r) swap(l,r);updata(l,r,1,color);}else{sff(l,r);mem(flag);ans = 0;if(l > r) swap(l,r);Query(l,r,1);printf("%d\n",ans);}}}return 0;
}