线段树求调 玄关
查看原帖
线段树求调 玄关
685325
zhangzhihao2卷王楼主2023/10/25 22:17

样例过不了,感觉和平常写的线段树没啥区别,随便改个lazytag,结果没过样例。查了半天不知道哪里错了。

#include<bits/stdc++.h>
#define ls (x<<1)
#define rs (x<<1|1)
using namespace std;
int n,m,tag[1000009],sum[1000009];

void f(int x,int l,int r){
    tag[x]^=1;
    if(tag[x]) sum[x]=r-l+1-sum[x];
}

void pushdown(int x,int l,int r){
    if(tag[x]){
        int mid=(l+r)>>1;
        f(ls,l,mid);
        f(rs,mid+1,r);
        tag[x]=0;
    }
}

void pushup(int x){
    sum[x]=sum[ls]+sum[rs];
}

void update(int x,int l,int r,int ql,int qr){
    if(ql<=l&&qr>=r){
        f(x,l,r);
        return;
    }
    pushdown(x,l,r);
    int mid=(l+r)>>1;
    if(mid>=ql) update(ls,l,mid,ql,qr);
    if(mid<qr) update(rs,mid+1,r,ql,qr);
    pushup(x);
}

int query(int x,int l,int r,int ql,int qr){
    if(ql<=l&&qr>=r) return sum[x];
    pushdown(x,l,r);
    int mid=(l+r)>>1,res=0;
    if(mid>=ql) res+=query(ls,l,mid,ql,qr);
    if(mid<qr) res+=query(rs,mid+1,r,ql,qr);
    pushup(x);
    return res;
}

int main(){
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        int op,l,r;
        cin>>op>>l>>r;
        if(op==1) update(1,1,n,l,r);
        else cout<<query(1,1,n,l,r)<<endl;
    }
    return 0;
}
2023/10/25 22:17
加载中...