萌新刚学OI,求助线段树
查看原帖
萌新刚学OI,求助线段树
399116
LYqwq楼主2022/2/28 21:20
#include <iostream>
using namespace std;
const int N=1e5+5;
int n,m,c,a,b;

template<typename T=int>
inline T read(){
    T X=0; bool flag=1; char ch=getchar();
    while(ch<'0' || ch>'9'){if(ch=='-') flag=0; ch=getchar();}
    while(ch>='0' && ch<='9') X=(X<<1)+(X<<3)+ch-'0',ch=getchar();
    if(flag) return X;
    return ~(X-1);
}

template<typename T=int>
inline void write(T X){
    if(X<0) putchar('-'),X=~(X-1);
    T s[20],top=0;
    while(X) s[++top]=X%10,X/=10;
    if(!top) s[++top]=0;
    while(top) putchar(s[top--]+'0');
    putchar('\n');
}

template<class T=long long>
class SgT{
    public:
        SgT(int rt=-1,int l=0,int r=0,int *_a=nullptr):a_res(new int[N]),a(_a==nullptr ? a_res : _a){
            for(int i=0; i<N; i++){
                a_res[i]=0;
            }
            if(rt!=-1) build(rt,l,r);
        }
        ~SgT(){
            delete[] a_res;
        }
        void build(int rt,int l,int r){
            t[rt].l=l,t[rt].r=r;
            t[rt].tag=0;
            if(l==r){
                t[rt].v=a[l];
                return;
            }
            int mid=l+r>>1;
            build(ls(rt),l,mid);
            build(rs(rt),mid+1,r);
            pushup(rt);
        }
        void update(int rt,int l,int r){
            if(l<=t[rt].l && t[rt].r<=r){
                t[rt].v=t[rt].r-t[rt].l+1-t[rt].v;
                t[rt].tag=!t[rt].tag;
                return;
            }
            pushdown(rt);
            int mid=t[rt].l+t[rt].r>>1;
            if(l<=mid) update(ls(rt),l,r);
            if(r>mid) update(rs(rt),l,r);
            pushup(rt);
        }
        T query(int rt,int l,int r){
            if(l<=t[rt].l && t[rt].r<=r){
                return t[rt].v;
            }
            pushdown(rt);
            T res=0;
            int mid=t[rt].l+t[rt].r>>1;
            if(l<=mid) res+=query(ls(rt),l,r);
            if(r>mid) res+=query(rs(rt),l,r);
            return res;
        }
    private:
        int *a,*a_res;
        struct node{
            int l,r;
            T v,tag;
        }t[N<<2];
        inline int ls(int rt){return rt<<1;}
        inline int rs(int rt){return rt<<1|1;}
        inline void pushup(int rt){
            t[rt].v=t[ls(rt)].v+t[rs(rt)].v;
        }
        inline void pushdown(int rt){
            if(!t[rt].tag) return;
            t[ls(rt)].v=t[ls(rt)].r-t[ls(rt)].l+1-t[ls(rt)].v;
            t[ls(rt)].tag=!t[ls(rt)].tag;
            t[rs(rt)].v=t[rs(rt)].r-t[rs(rt)].r+1-t[rs(rt)].v;
            t[rs(rt)].tag=!t[rs(rt)].tag;
            t[rt].tag=0;
        }
};

int main(){
    n=read(),m=read();
    SgT t(1,1,n);
    while(m--){
        c=read(),a=read(),b=read();
        if(c==1){
            t.update(1,a,b);
        }else{
            write(t.query(1,a,b));
        }
    }
    return 0;
}

RE 了,也不知道为啥。反正就是,RE 了。

2022/2/28 21:20
加载中...