各位佬看看,呜呜呜,找不到错误,10分
查看原帖
各位佬看看,呜呜呜,找不到错误,10分
633740
VESPER_楼主2022/8/18 22:56
#include<iostream>
using namespace std;
const int N = 320010;
char a[N * 4];
struct Node{
    int l,r;
    int sum;
    bool add;
} tr[N * 4];

void pushup(int u){
    tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum;
}

void pushdown(int u){
    auto &root = tr[u] , &left = tr[u << 1] , &right = tr[u << 1 | 1];
    if(root.add){
        left.add ^= 1;
        right.add ^= 1; 
        int llen = left.r - left.l + 1;
        left.sum = llen - left.sum;
        int rlen = right.r - right.l + 1;
        right.sum = rlen - right.sum;
        root.add = 0;
    }
}

void modify(int u , int l , int r){
    if(tr[u].l >= l && tr[u].r <= r) {
        tr[u].sum = (tr[u].r - tr[u].l + 1) - tr[u].sum;
        tr[u].add = 1;
    } else {
        pushdown(u);
        int mid = tr[u].l + tr[u].r >> 1;
        if(l <= mid) modify(u << 1 , l , r );
        if(r > mid) modify(u << 1 | 1  , l, r);
        pushup(u);
    }
}

int query(int u , int l , int r){
    if(tr[u].l >= l && tr[u].r <= r) return tr[u].sum;
        pushdown(u); // 记得传递懒标记
        int v = 0;
        int mid = tr[u].l + tr[u].r >> 1;
        if(l <= mid) v += query(u << 1 , l , r);
        if(r > mid) v += query(u << 1 | 1 , l , r);
        return v;
}

void build(int u , int l , int r){
    if(l == r) tr[u] = { r, r , a[r] - '0', 0};
    else {
        tr[u] = {l , r}; // 记得更新区间端点
        int mid = l + r >> 1;
        build(u << 1 , l , mid);
        build(u << 1 | 1 , mid + 1 , r);
        pushup(u);
    }
}

signed main(){
    int n,m;cin >> n >> m;
    cin >> a + 1;
    build(1,1,n);
    // for(int i = 1;i <= n;i ++ )cout << tr[i].sum << " ";
    // cout << tr[1].sum << '\n';
    while(m -- ) {
        int t,l,r;
        cin >> t >> l >> r;
        if(t) {
            cout << query(1, l, r) << '\n';
        } else {
            modify(1, l , r);
        }
    }
    
}
2022/8/18 22:56
加载中...