就#2AC了,大佬求调求求
查看原帖
就#2AC了,大佬求调求求
1093559
XenoWorld楼主2024/2/26 17:17
#include<iostream>
#include<cstring>
#define MAX_N 100010
using namespace std;
bool tree[MAX_N<<2|1];
long long sum[MAX_N<<2]={0};
long long ls(long long p){  
    return p<<1;
}
long long rs(long long p){
    return p<<1|1;
}
void push_down(long long p,long long l,long long r,long long mid){
    if(!tree[p])return;
    sum[ls(p)]=mid-l+1-sum[ls(p)];
    sum[rs(p)]=r-mid-sum[rs(p)];
    if(!tree[ls(p)]){
        tree[ls(p)]=true;
    }
    if(!tree[rs(p)]){
        tree[rs(p)]=true;
    }   
    tree[p]=false;
}
void push_up(long long p){
    sum[p]=sum[ls(p)]+sum[rs(p)];
}
void update(long long p,long long l,long long r,long long x,long long y){
    if(x<=l&&y>=r){
        sum[p]=r-l+1-sum[p];
        if(!tree[p]){
            tree[p]=true;
        }
        return;
    }
    long long mid=(l+r)>>1;
    push_down(p,l,r,mid);
    if(x<=mid)update(ls(p),l,mid,x,y);
    if(y>mid)update(rs(p),mid+1,r,x,y);
    push_up(p);
}
long long query(long long p,long long l,long long r,long long x,long long y){
    if(x<=l&&y>=r){
        return sum[p];
    }
    long long ans=0;
    long long mid=(l+r)>>1;
    push_down(p,l,r,mid);
    if(x<=mid)ans+=query(ls(p),l,mid,x,y);
    if(y>mid)ans+=query(rs(p),mid+1,r,x,y);
    return ans;
}
int main(){
    long long n=0,m=0;
    cin>>n>>m;
    memset(tree,false,sizeof(tree));
    for(long long i=1;i<=m;i++){
        long long op=0;
        cin>>op;
        long long x=0,y=0;
        if(op==0){
            cin>>x>>y;
            update(1,1,n,x,y);
        }
        else if(op==1){
            cin>>x>>y;
            cout<<query(1,1,n,x,y)<<endl;
        }
    }



    return 0;
}
2024/2/26 17:17
加载中...