线段树求调,本地正常,在cf上就输出不对
查看原帖
线段树求调,本地正常,在cf上就输出不对
1045028
xhz123456789楼主2024/7/30 19:58
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
ull n=0,m=0,a=0,b=0,x=0,opt=0;
struct node{
    ull l,r,mid,val[64],tag;
    node*l_s,*r_s;
    static ull l_fun,r_fun,x_fun;
    node(int l_,int r_){
        l=l_,r=r_,mid=(l_+r_)>>1;
        memset(val,0,sizeof(val));
        l_s=r_s=nullptr;
    }
    inline void __update__(){for(ull i=0,*l_val=l_s->val,*r_val=r_s->val;i<31;i++)val[i]=l_val[i]+r_val[i];}
    inline void __pd__(){
        if(tag){
            for(ull *i=l_s->val,*e=i+31,p=tag,tot=mid-l;i!=e;i++,p>>=1)if(p&1ull)*i=tot-*i;
            for(ull *i=r_s->val,*e=i+31,p=tag,tot=r-mid;i!=e;i++,p>>=1)if(p&1ull)*i=tot-*i;
            l_s->tag^=tag,r_s->tag^=tag,tag=0ull;
        }
    }
    void init(){
        if(l+1==r){
            cin>>x_fun;
            for(ull*i=val;x_fun;x_fun>>=1,i++) *i=x_fun&1ull,cout<<(x_fun&1ull);
            return;
        }
        (l_s=new node(l,mid))->init(),(r_s=new node(mid,r))->init();
        __update__();
    }
    void __query__(){
        if(l_fun<=l&&r_fun>=r){
            for(ull *i=val,*e=val+31,p=1;i!=e;i++,p<<=1) if(*i)x_fun+=((*i)*p);
            return ;
        }
        __pd__();
        if(l_fun<mid) l_s->__query__();
        if(r_fun>mid) r_s->__query__();
    }
    void __modify__(){
        if(l_fun<=l&&r_fun>=r){
            for(ull *i=val,*e=val+31,p=x_fun,tot=r-l;p;i++,p>>=1)if(p&1ull)*i=tot-*i;
            tag^=x_fun;
            return ;
        }
        __pd__();
        if(l_fun<mid) l_s->__modify__();
        if(r_fun>mid) r_s->__modify__();
        __update__();
    }
    inline ull query(ll l,ll r){return l_fun=l,r_fun=r,x_fun=0,__query__(),x_fun;}
    inline void modify(ll l,ll r,ull x){return l_fun=l,r_fun=r,x_fun=x,__modify__();}
};
ull node::l_fun,node::r_fun,node::x_fun;
node*root;
int main(){
    cin>>n;
    (root=new node(1,n+1))->init();
    cin>>m;
    while(m--){
        cin>>opt>>a>>b;
        if(opt==2){
            cin>>x;
            root->modify(a,b+1,x);
        }else{
            cout<<root->query(a,b+1)<<'\n';
        }
    }
    return  0;
}

样例:

5
4 10 3 13 7
8
1 2 4
2 1 3 3
1 2 4
1 3 3
2 2 5 5
1 1 5
2 1 2 10
1 2 3

cf输出:

1665512566
1665512564
1127969377
3383908163
1127969386
2024/7/30 19:58
加载中...