老老实实用分块做的,哪里错了 哇哇哇哇
查看原帖
老老实实用分块做的,哪里错了 哇哇哇哇
185406
QSR_ranroader楼主2020/12/12 20:24
#include<bits/stdc++.h>
using namespace std;
const int N = 200005;

int bz;
int a[N], q[N];
int res[N], sum[N];

void update(int l, int r){
    for(int i=l; i<=min(q[l]*bz, r); i++){
        if(a[i] == 0){
            res[q[i]]++;
            a[i] = 1;
        }else {
            res[q[i]]--;
            a[i] = 0;
        }
    }
    if(q[l] != q[r]){
        for(int i=(q[r]-1)*bz + 1; i<=r; i++){
            if(a[i] == 0){
                res[q[i]]++;
                a[i] = 1;
            }else {
                res[q[i]]--;
                a[i] = 0;
            }
        }
    }
    for(int i=q[l]+1; i<=q[r]-1; i++){
        res[i] = bz - res[i];
        sum[i]++;
    }
}

int query(int l, int r){
    int s = 0;
    for(int i=l; i<=min(q[l]*bz, r); i++){
        if((a[i] + sum[q[i]]) % 2 == 1){
            s++;
        }
    }
    //printf("s = %d\n", s);
    if(q[l] != q[r]){
        for(int i=(q[r]-1)*bz + 1; i<=r; i++){
            if((a[i] + sum[q[i]]) % 2 == 1){
                s++;
            }
        }
    }
    for(int i=q[l]+1; i<=q[r]-1; i++){
        s += res[i];
    }
    return s;
}

int main(){
    int n, m, op, l, r;
    scanf("%d%d", &n, &m);
    bz = sqrt(1.0 * n);
    for(int i=1; i<=n; i++){
        q[i] = (i - 1) / bz + 1;
    }
    for(int i=1; i<=m; i++){
        scanf("%d%d%d", &op, &l, &r);
        if(op == 0){
            update(l, r);
        }else {
            printf("%d\n", query(l, r));
        }
    }
    return 0;
}

2020/12/12 20:24
加载中...