0
点赞
收藏
分享

微信扫一扫

poj2777 线段树染色

上古神龙 2022-02-05 阅读 28

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;
        }
    }
}
举报

相关推荐

0 条评论