大佬捏,求求尼帮一下我讷
  • 板块灌水区
  • 楼主StrFaith
  • 当前回复6
  • 已保存回复6
  • 发布时间2023/11/10 19:41
  • 上次更新2023/11/10 21:11:43
查看原帖
大佬捏,求求尼帮一下我讷
970752
StrFaith楼主2023/11/10 19:41

P1558

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+1;
int n, m;
int col[maxn << 2], tag[maxn << 2];
void up(int n) {
    col[n] = col[n << 1] | col[n << 1|1];
}
void down(int n) {
    if(tag[n]) {
        tag[n << 1] = tag[n << 1 |1] = tag[n];
        col[n << 1] =  (1 << tag[n]);
        col[n << 1|1] = (1 << tag[n]);
        tag[n] = 0;
    }
}
void build(int l, int r, int n) {
    if(l == r) {
        col[n] = 1 << 1;
        return;
    }
    int mid = (l + r) >>1;
    build(l, mid, n<<1);
    build(mid +1, r, n<<1|1);
    up(n);
}
void change(int a, int b, int k, int l, int r, int n) {
    if(a <= l && r <= b) {
        tag[n] = k;
        col[n] = 1 << k;
        return;
    }
    down(n);
    int mid = ( l+ r) >> 1;
    if(mid >= a) change(a, b, k, l, mid , n<<1);
    if(mid < b) change(a, b, k, mid+1, r, n<<1|1);
    up(n);
}
int query(int a,int b, int l, int r, int n) {
    if(a <= l && r <= b) {
        return col[n];
    }
    down(n);
    int mid = (l + r) >>1;
    int ans = 1 << 1;
    if(mid >=a) ans |= query(a, b, l, mid , n <<1);
    if(mid < b) ans |= query(a, b, mid+1, r, n<<1|1);
    return ans;
}
int bit[(1 << 16)];
int sol(int a, int b) {
    int ans = query(a, b, 1, n , 1);
    ans = bit[ans >> 16] + bit[ans & ((1 << 16) - 1)];
    return ans;
}
int main() {
    int t;
    cin >> n  >> t >> m;
    bit[0] = bit[1] =1;
    for(int i = 2; i <= (1 << 16); i++) {
        bit[i] = bit[(i >> 1)] + (i & 1);
    }
    build(1, n, 1);
    while(m--) {
        char m[2];
        scanf("%s", m);
        int a, b;
        if(m[0] == 'C'){
            int c;
            scanf("%d%d%d", &a, &b, &c);
            if(a > b) swap(a, b);
            if(c > t) continue;
            change(a, b, c, 1, n, 1);
        }
        else {
            scanf("%d%d", &a, &b);
            if(a > b) swap(a, b);
            //int ans = sol(a, b);
            int ans= 0;
            int aa = query(a, b, 1, n, 1);
            for(int i = 1; i<=t;i++) {
                if(aa & (1 << i))ans++;
            }
            printf("%d\n", ans);
        }
    }
    return 0;
}

2023/11/10 19:41
加载中...