没有SPOJ的号,求好心人帮忙交一下,玄关
查看原帖
没有SPOJ的号,求好心人帮忙交一下,玄关
1046894
hyxgg楼主2024/8/25 20:53

代码如下

#include<iostream>
#include<cstdio>
#define N 100005
#define ll long long
using namespace std;
struct xds{
	ll lz,rz,z,l,r,z1;
}yd[N*50];
ll n,m,a[N],cnt,rt[N];
void js(ll &b,ll l,ll r){
	b=++cnt;
	yd[b].l=l,yd[b].r=r;
	if(l==r){
		yd[b].z=a[yd[b].l]-a[yd[b].l-1];
		yd[b].z1=(a[yd[b].l]-a[yd[b].l-1])*(yd[b].l-1);
		// cout<<l<<' '<<r<<' '<<yd[b].z1<<' '<<yd[b].z<<endl;
		return;
	}
	ll mid=(l+r)>>1;
	js(yd[b].lz,l,mid);
	js(yd[b].rz,mid+1,r);
	yd[b].z=yd[yd[b].lz].z+yd[yd[b].rz].z;
	yd[b].z1=yd[yd[b].lz].z1+yd[yd[b].rz].z1;
}
ll md(ll b){
	ll nb=++cnt;
	yd[nb]=yd[b];
	return nb;
}
ll gd(ll b,ll z,ll x){
	b=md(b);
	if(yd[b].l==yd[b].r){
		yd[b].z+=z;
		yd[b].z1+=z*(x-1);
		return b;
	}
	ll mid=(yd[b].l+yd[b].r)>>1;
	if(x<=mid)yd[b].lz=gd(yd[b].lz,z,x);
	else yd[b].rz=gd(yd[b].rz,z,x);
	yd[b].z=yd[yd[b].lz].z+yd[yd[b].rz].z;
	yd[b].z1=yd[yd[b].lz].z1+yd[yd[b].rz].z1;
	return b;
}
ll cx(ll b,ll x,ll y){
	if(yd[b].l>=x&&yd[b].r<=y){
		// cout<<yd[b].l<<' '<<yd[b].r<<endl;
		return yd[b].z*y-yd[b].z1;
	}
	ll mid=(yd[b].l+yd[b].r)>>1;
	ll s=0;
	if(x<=mid)s+=cx(yd[b].lz,x,y);
	if(y>mid) s+=cx(yd[b].rz,x,y);
	return s;
}
int main(){
	scanf("%lld%lld",&n,&m);
	for(ll i=1;i<=n;i++){
		scanf("%lld",&a[i]);
		ll dc=a[i]-a[i-1];
	}
	js(rt[0],1,n);
	ll bb,cc,dd;
	char aa;
	ll dt=0;
	for(ll i=1;i<=m;i++){
		aa=getchar();
		while(aa!='Q'&&aa!='C'&&aa!='H'&&aa!='B')aa=getchar();
		scanf("%lld",&bb);
		if(aa=='B'){
			dt=bb;
		}
		else{
			scanf("%lld",&cc);
			if(aa=='Q'){
				ll ans=cx(rt[dt],1,cc)-(bb==1?0:cx(rt[dt],1,bb-1));
				printf("%lld\n",ans);
			}
			else{
				scanf("%lld",&dd);
				if(aa=='H'){
					ll ans=cx(rt[dd],1,cc)-(bb==1?0:cx(rt[dd],1,bb-1));
					printf("%lld",ans);
				}
				else{
					dt++;
					rt[dt]=rt[dt-1];
					rt[dt]=gd(rt[dt],dd,bb);
					rt[dt]=gd(rt[dt],-dd,cc+1);
				}
			}
		}
	}
	return 0;
}
2024/8/25 20:53
加载中...