求助,fhqtreapWA了
查看原帖
求助,fhqtreapWA了
264548
Tangent233楼主2021/4/14 17:38
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
struct node
{
	int l,r;
	long long val,result;
	int key,sz;
	long long plus;
	#define l(x) tree[x].l
	#define r(x) tree[x].r
	#define v(x) tree[x].val
	#define k(x) tree[x].key
	#define s(x) tree[x].sz
	#define p(x) tree[x].plus
	#define re(x) tree[x].result
}tree[maxn];
int cnt,rt;
int x,y,z;
inline int newnode(long long v)
{
	v(++cnt)=v;
	k(cnt)=rand();
	s(cnt)=1;
	return cnt;
}
inline void update(int now)
{
	s(now)=s(l(now))+s(r(now))+1;
	re(now)=re(l(now))+re(r(now))+v(now);
}
inline void add(int now,long long v)
{
	v(now)+=v;
	p(now)+=v;
	re(now)+=v*s(now);
}
inline void pushdown(int now)
{
	if(p(now)==0) return;
	add(l(now),p(now));
	add(r(now),p(now));
	p(now)=0;
}
void split(int now,int siz,int &x,int &y)
{
	if(!now) x=y=0;
	else
	{
		pushdown(now);
		if(s(l(now))<siz)
		{
			x=now;
			split(r(now),siz-s(l(now))-1,r(now),y);
		}
		else
		{
			y=now;
			split(l(now),siz,x,l(now));
		}
		update(now);
	}
}
int merge1(int x,int y)
{
	if(!x||!y) return x+y;
	if(k(x)<k(y))
	{
		pushdown(x);
		r(x)=merge1(r(x),y);
		update(x);
		return x;
	}
	else
	{
		pushdown(y);
		l(y)=merge1(x,l(y));
		update(y);
		return y;
	}
}
long long que(int l,int r)
{
	split(rt,l-1,x,y);
	split(y,r-l+1,y,z);
	long long ans=re(y);
	rt=merge1(merge1(x,y),z);
	return ans;
}
long long change(int l,int r,long long v)
{
	split(rt,l-1,x,y);
	split(y,r-l+1,y,z);
	add(y,v);
	rt=merge1(merge1(x,y),z);
}
int main()
{
	int n,m;
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		long long k;
		scanf("%lld",&k);
		rt=merge1(rt,newnode(k));
	}
	for(int i=1;i<=m;i++)
	{
		int opt,l,r;
		scanf("%d %d %d",&opt,&l,&r);
		if(opt==2)
			printf("%lld\n",que(l,r));
		else
		{
			long long v;
			scanf("%lld",&v);
			change(l,r,v);
		}
	}
	return 0;
}

后面八个点全都wa了

2021/4/14 17:38
加载中...