悬关求助,想了好几天还是没查出来这题错在哪儿
查看原帖
悬关求助,想了好几天还是没查出来这题错在哪儿
113001
xuhrrr楼主2024/3/11 21:30

代码如下:

#include <iostream>
#include <algorithm>
#include <cmath>
#define maxn 100005
using namespace std;
int n,m;
int a[maxn],w[maxn * 4];
int tag[maxn * 4];
void build(int u,int l,int r){
    if(l == r)w[u] = 0;
    else{
        int mid = (l + r) / 2;
        build(u * 2 ,l,mid);
        build(u * 2 + 1,mid + 1,r);
        w[u] = w[u * 2] + w[u * 2 + 1];
    }
}
void maketag(int u,int l,int r){
    w[u] = r - l + 1 - w[u];
    tag[u] ^= 1;
}
void pushdown(int u,int l,int r){
    int mid = (l + r) / 2;
    maketag(u * 2,l,mid);
    maketag(u * 2 + 1 ,mid + 1,r);
    tag[u] = 0;
}
void update(int u,int L,int R,int l,int r){
    if(l <= L && R <= r){
        maketag(u,L,R);
    }
    else{
        if(!(L > r || R < l)){
            int mid = (L + R) / 2;
            pushdown(u,L,R);
            if(l <= mid)update(u * 2 ,L,mid,l,r);
            if(r >= mid + 1)update(u * 2 + 1,mid + 1,R,l,r);
            w[u] = w[u * 2] + w[u * 2 + 1];
        }
    }
    //cout << u << " " << w[u] << endl;
}
int getsum(int u,int L,int R,int l,int r){
    if(l <= L && R <= r){
        return w[u];
    }
    else{
        //pushdown(u,L,R);
        if(!(L > r || R < l)){
            int mid = (L + R) / 2;
            pushdown(u,L,R);
            return getsum(u * 2 ,L,mid,l,r) + getsum(u * 2 + 1,mid + 1,R,l,r);
        }
        else{
            return 0;
        }
    }
}
int main()
{
    cin >> n >> m;
    build(1,1,n);
    for(int i = 1 ; i <= m ; ++i){
        int op,x,y;
        cin >> op >> x >> y;
        if(op == 0){
            update(1,1,n,x,y);
        }
        else{
            cout << getsum(1,1,n,x,y) << endl;
        }
    }
    return 0;
}

样例输出为2 2,但是第一个我确实没查出来怎么错的

2024/3/11 21:30
加载中...