动态开点样例没过求调
查看原帖
动态开点样例没过求调
586932
White_Wat楼主2023/11/22 22:47

RT
求调

#include<iostream>

using namespace std;

#define N 100010

int n,m;
int a[N];
int cnt,root;
long long d[N*2],la[N*2];
int ls[N*2],rs[N*2];

void make(int l,int r,int &p)
{
	if(!p)
	{
		p=++cnt;
		if(l==r) d[p]=a[l];
	}
}

void update(int l,int r,int s,int t,int &p,int c)
{
	make(s,t,p);
	if(l<=s&&t<=r)
	{
		d[p]+=(t-s+1)*c;
		la[p]+=c;
		return ;
	}
	
	int mid=s+((t-s)>>1);
	if(la[p]&&s!=t)
	{
		make(s,mid,ls[p]);
		make(mid+1,t,rs[p]);
		la[ls[p]]+=la[p];
		la[rs[p]]+=la[p];
		
		d[ls[p]]+=la[p]*(mid-s+1);
		d[rs[p]]+=la[p]*(t-mid);
		
		la[p]=0;
	}
	
	if(l<=mid) update(l,r,s,mid,ls[p],c);
	if(r>mid) update(l,r,mid+1,t,rs[p],c);
	
	d[p]=d[ls[p]]+d[rs[p]];
}

long long get_sum(int l,int r,int s,int t,int &p)
{
	make(s,t,p);
	if(l<=s&&t<=r)
	{
		return d[p];
	}
	
	int mid=s+((t-s)>>1);
	if(la[p]&&s!=t)
	{
		make(s,mid,ls[p]);
		make(mid+1,t,rs[p]);
		la[ls[p]]+=la[p];
		la[rs[p]]+=la[p];
		
		d[ls[p]]+=la[p]*(mid-s+1);
		d[rs[p]]+=la[p]*(t-mid);
		
		la[p]=0;
	}
	
	long long sum=0;
	if(l<=mid) sum+=get_sum(l,r,s,mid,ls[p]);
	if(r>mid) sum+=get_sum(l,r,mid+1,t,rs[p]);
	return sum;
}

int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	
	while(m--)
	{
		int op,l,r,k;
		scanf("%d%d%d",&op,&l,&r);
		if(op==1)
		{
			scanf("%d",&k);
			update(l,r,1,n,root,k);
		}
		else
		{
			printf("%lld\n",get_sum(l,r,1,n,root));
		}
	}
	
	return 0;
}

不是全职OIer不能及时回复,望见谅

2023/11/22 22:47
加载中...