能过样例,但WA声一片
  • 板块P1558 色板游戏
  • 楼主乙轩
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/30 20:03
  • 上次更新2024/8/30 22:32:15
查看原帖
能过样例,但WA声一片
777319
乙轩楼主2024/8/30 20:03
#include <bits/stdc++.h>
using namespace std;
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
#define mid ((l+r)>>1)
const int MAXN = 1e5 + 5;
int L,T,O;
bitset <32> s[MAXN << 2],t[MAXN << 2],ans;

void push_up(int p){
    s[p] = s[ls(p)] | s[rs(p)];
}

void push_down(int p){
    s[ls(p)] = t[p];
    s[rs(p)] = t[p];
    t[ls(p)] = t[rs(p)] = t[p];
    t[p] = 0;
}

void build(int p,int l,int r){
    if (l==r){
        s[p][1] = 1;
        return ;
    }
    build(ls(p),l,mid);
    build(rs(p),mid+1,r);
    push_up(p);
}

void update(int p,int l,int r,int L,int R,int x){
    if (l > R || r < L) return ;
    if (l >= L && r <= R){
        s[p] = 0;
        t[p] = 0;
        s[p][x] = 1;
        t[p][x] = 1;
        return;
    }
    if (t[p].count()) push_down(p);
    update(ls(p),l,mid,L,R,x);
    update(rs(p),mid+1,r,L,R,x);
    push_up(p);
}

void ask(int p,int l,int r,int L,int R){
    if (l > R || r < L){
        return ;
    }
    if (l >= L && r <= R){
        ans = ans | s[p];
        return ;
    }
    if (t[p].count()) push_down(p);
    ask(ls(p),l,mid,L,R);
    ask(rs(p),mid+1,r,L,R);
}

int main(){
    ios::sync_with_stdio(0);
    cin >> L >> T >> O;
    build(1,1,L);
    while (O--){
        char o;
        cin >> o;
        if (o == 'C'){
            int l,r,x;
            cin >> l >> r >> x;
            update(1,1,L,l,r,x);
        }else{
            int l,r;
            cin >> l >> r;
            ans = 0;
            ask(1,1,L,l,r);
            cout << ans.count() << endl;
        }
    }
    return 0;
}
2024/8/30 20:03
加载中...