Link
题意
两种操作
1.将[a, b] 改为颜色c
2.询问[a,b] 有几种颜色
初始颜色均为1
很久没做过线段树了,温习一下。
struct SegmentTree {
int l, r;
int col;
int lz;
#define l(x) tree[x].l
#define r(x) tree[x].r
#define col(x) tree[x].col
#define lz(x) tree[x].lz
}tree[maxn << 2];
void push(int p) {
if(col(p<<1)==col(p<<1|1))
col(p) = col(p<<1);
else
col(p) = -1;
}
void build(int p, int l, int r) {
l(p) = l; r(p) = r;
if(l == r) {
col(p) = 1;
return;
}
int mid = (l + r) >> 1;
build(p<<1, l, mid);
build(p<<1|1, mid + 1, r);
push(p);
}
void spread(int p) {
if(lz(p)) {
lz(p<<1) = lz(p<<1|1) = lz(p);
col(p<<1) = col(p<<1|1) = lz(p);
lz(p) = 0;
}
}
void change(int p, int l, int r, int d) {
if(l(p) >= l && r(p) <= r) {
col(p) = d;
lz(p) = d;
return;
}
spread(p);
int mid = (l(p) + r(p)) >> 1;
if(l <= mid) change(p<<1, l, r, d);
if(r > mid) change(p<<1|1, l, r, d);
push(p);
}
int ans;
void query(int p, int l, int r) {
if(l(p) >= l && r(p) <= r) {
if(col(p) == 0) return ;
else if(col(p) > 0) {
ans = ans | (1<<col(p));
return;
}
else {
spread(p);
int mid = (l(p) + r(p)) >> 1;
if(l <= mid) query(p<<1, l, r);
if(r > mid) query(p<<1|1, l, r);
}
return;
}
spread(p);
int mid = (l(p) + r(p)) >> 1;
if(l <= mid) query(p<<1, l, r);
if(r > mid) query(p << 1|1, l ,r);
}
void solve() {
int l, t, o;
cin >> l >> t >> o;
build(1, 1, l);
while(o--) {
char c;
cin >> c;
if(c == 'C') {
int u, v, w;
cin >> u >> v >> w;
if(u > v) swap(u, v);
change(1, u, v, w);
}
else {
int u, v;
ans = 0;
cin >> u >> v;
if(u > v) swap(u, v);
query(1, u, v);
int cnt = 0;
while(ans) {
if(ans & 1) cnt++;
ans >>= 1;
}
cout << cnt << endl;
}
}
}