1 条题解

  • 0
    @ 2026-8-3 16:22:33
    #include<bits/stdc++.h>
    #define lc(p) tr[p].ls
    #define rc(p) tr[p].rs
    using namespace std;
    typedef long long ll;
    int n,q,id,rt,a[200010];
    mt19937 rd(999983);
    struct N{
    	int ls,rs,rd,v,la,sz;
    	ll c;
    }tr[200010];
    int nd(int v){
    	tr[++id]={0,0,rd(),v,0,1,v};
    	return id;
    }
    void pushup(int p){
    	tr[p].c=tr[p].v+tr[lc(p)].c+tr[rc(p)].c;
    	tr[p].sz=tr[lc(p)].sz+tr[rc(p)].sz+1;
    }
    void pushdown(int p){
    	if(tr[p].la){
    		swap(lc(p),rc(p));
    		tr[lc(p)].la^=1;
    		tr[rc(p)].la^=1;
    		tr[p].la=0; 
    	}
    }
    void split(int p,int k,int &x,int &y){
    	if(!p){
    		x=y=0;
    		return ;
    	}
    	pushdown(p);
    	if(tr[lc(p)].sz<k){
    		x=p;
    		split(rc(p),k-tr[lc(p)].sz-1,rc(p),y);
    	}
    	else{
    		y=p;
    		split(lc(p),k,x,lc(p));
    	}
    	pushup(p);
    }
    int merge(int x,int y){
    	if(!x||!y)return x|y;
    	if(tr[x].rd<tr[y].rd){
    		pushdown(x);
    		rc(x)=merge(rc(x),y);
    		pushup(x);
    		return x;
    	}
    	else{
    		pushdown(y);
    		lc(y)=merge(x,lc(y));
    		pushup(y);
    		return y;
    	}
    }
    void change(int l,int r){
    	int x,y,z;
    	split(rt,r,x,y);
    	split(x,l-1,x,z);
    	tr[z].la^=1;
    	rt=merge(merge(x,z),y);
    }
    ll find(int l,int r){
    	int x,y,z;
    	split(rt,r,x,y);
    	split(x,l-1,x,z);
    	ll ans=tr[z].c;
    	rt=merge(merge(x,z),y);
    	return ans;
    }
    int main(){
    	ios::sync_with_stdio(0);
    	cin.tie(0);
    	cin>>n>>q;
    	for(int i=1;i<=n;i++){
    		cin>>a[i];
    		rt=merge(rt,nd(a[i]));
    	}
    	while(q--){
    		int op,l,r;
    		cin>>op>>l>>r;l++;
    		if(op==0)change(l,r);
    		else cout<<find(l,r)<<'\n';
    	}
    	return 0;
    }
    
    • 1

    区间翻转区间求和(Range Reverse Range Sum)

    信息

    ID
    8136
    时间
    1000ms
    内存
    1024MiB
    难度
    9
    标签
    递交数
    10
    已通过
    4
    上传者