萌新求助,和标程对拍了114514秒,完全正确,SPOJ WA
查看原帖
萌新求助,和标程对拍了114514秒,完全正确,SPOJ WA
614527
xwh_Marvelous楼主2023/7/22 13:55
#include<bits/stdc++.h>
using namespace std;
#define N 100005
#define int long long
int n,m;
int now,rt[N*2],tot;
struct seg{
	#define ls lc[x]
	#define rs rc[x]
	#define mid ((l+r)>>1)
	int a[N*20],tag[N*20],lc[N*20],rc[N*20],tot;
	void addnode(int &x){
		if(x==0)x=++tot;
	}
	void push_up(int x,int l,int r){
		// if(l==r){a[x]=tag[x];return;}
		a[x]=a[ls]+a[rs]+tag[x]*(r-l+1);
	}
	void upd(int o,int L,int R,int &x,int l,int r,int lst){
		if(x==0)addnode(x),tag[x]=tag[lst],a[x]=a[lst];
		if(L<=l&&r<=R){
			ls=lc[lst],rs=rc[lst];
			tag[x]+=o;
			push_up(x,l,r);
			// cout<<x<<' '<<l<<' '<<r<<' '<<a[x]<<endl;
			return;
		}
		if(L<=mid)upd(o,L,R,ls,l,mid,lc[lst]);
		if(R>mid)upd(o,L,R,rs,mid+1,r,rc[lst]);
		if(L>mid)ls=lc[lst];
		if(R<=mid)rs=rc[lst];
		push_up(x,l,r);
			// cout<<x<<' '<<l<<' '<<r<<' '<<a[x]<<endl;
	}
	int query(int L,int R,int &x,int l,int r,int stag){
		if(L<=l&&r<=R){
			// cout<<a[x]<<' '<<tag[x]<<' '<<l<<' '<<r<<endl;
			return a[x]+stag*(r-l+1);
		}
		int ret=0;
		if(L<=mid)ret+=query(L,R,ls,l,mid,stag+tag[x]);
		if(R>mid)ret+=query(L,R,rs,mid+1,r,stag+tag[x]);
		return ret;
	}
}mp;
signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	// freopen("out.txt","r",stdin);
	// freopen("a.txt","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		int o;
		cin>>o;
		mp.upd(o,i,i,rt[now],1,n,rt[now]);
	}
	while(m--){
		char op;int a,b,c;
		cin>>op>>a;
		// for(int i=1;i<=5;i++)cout<<mp.query(i,i,rt[now],1,n,0)<<' ';cout<<endl;
		if(op=='B')now=a;
		else{
			cin>>b;
			if(op=='Q'){
				cout<<mp.query(a,b,rt[now],1,n,0)<<'\n';
			}else{
				cin>>c;
				if(op=='C'){
					rt[now+1]=0;
					mp.upd(c,a,b,rt[now+1],1,n,rt[now]);
					now++;
				}else{
					cout<<mp.query(a,b,rt[c],1,n,0)<<'\n';
				}
			}
		}
		// cout<<now<<endl;
	}
	return 0;
}
2023/7/22 13:55
加载中...