大佬们P2357最后一个点wa了不知道为啥,求指点!!
  • 板块学术版
  • 楼主改名避牛马
  • 当前回复1
  • 已保存回复1
  • 发布时间2021/8/31 20:40
  • 上次更新2023/11/4 08:14:09
查看原帖
大佬们P2357最后一个点wa了不知道为啥,求指点!!
180967
改名避牛马楼主2021/8/31 20:40
#include<bits/stdc++.h>
using namespace std;
int n,f,a[200010],ss=0;
inline void read(int &x)
{
	x=0;
	int f=1;
	char ch;
	ch=getchar();
	while(ch>'9'||ch<'0')
	{
		if(ch=='-')
		f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=x*10+ch-'0';
		ch=getchar();
	}
	x*=f;
}
struct tree
{
	int l;
	int r;
	long long s;
 	int add;
} t[800010];
void build(int q,int l,int r)
{
	t[q].l=l;t[q].r=r;
	if(l==r)
	{
		t[q].s=a[l];
		return;
	}
	int m=(l+r)/2;
	build(q<<1,l,m);
	build(q<<1|1,m+1,r);
	t[q].s=t[q<<1].s+t[q<<1|1].s;
}
void spread(int x)
{
	if(t[x].add!=0)
	{
		t[x<<1].s+=(t[x<<1].r-t[x<<1].l+1)*t[x].add;
		t[x<<1|1].s+=(t[x<<1|1].r-t[x<<1|1].l+1)*t[x].add;
		t[x<<1].add+=t[x].add;
		t[x<<1|1].add+=t[x].add;
		t[x].add=0;
	}
}
void change(int q,int l,int r,int j)
{
	if(t[q].l>=l&&t[q].r<=r)
	{
		t[q].s+=(t[q].r-t[q].l+1)*j;
		t[q].add+=j;
		return;
	}
	spread(q);
	int m=(t[q].l+t[q].r)/2;
    if(m>=l) change(q*2,l,r,j);
    if(m<r) change(q*2+1,l,r,j);
    t[q].s=t[q*2].s+t[q*2+1].s; 
}
long long ask(int q,int l,int r)
{
	long long ans=0;
	if(l<=t[q].l&&t[q].r<=r)
	{
		return t[q].s;
	}
	spread(q);
	int m=(t[q].l+t[q].r)/2;
	if(m>=l) ans+=ask(q<<1,l,r);
	if(r>m) ans+=ask(q<<1|1,l,r);
	return ans;
}
/*void change1(int q,int x,int v)
{
	if(t[q].l<=t[q].r)
	{
		t[q].s=v;
		return;
	}
	//spread(q);
	int m=(t[q].l+t[q].r)/2;
	if(m>=x) change1(q*2,x,v);
	else change1(q*2+1,x,v);
    t[q].s=t[q<<1].s+t[q<<1+1].s;
}*/
int main()
{
	read(n);read(f);
	for(register int i=1;i<=n;i++)
	{
		read(a[i]); 
	}
	ss=a[1];
	build(1,1,n);
	//for(int i=1;i<=n*4;i++)
	//cout<<t[i].l<<" "<<t[i].r<<" "<<t[i].s<<endl;
	int r,x,y,z;
	for(register int i=1;i<=f;i++)
	{
		read(r);
		if(r==1)
		{
			read(x);
			read(y);
			read(z);
			if(x==1)
			ss+=z;
			change(1,x,y,z);
		}
		else if(r==2)
		{
			read(x);
			ss+=x;
			//change1(1,1,ss);
			change(1,1,1,x);
		}
		else if(r==3)
		{
			read(x);
			ss-=x;
			//change1(1,1,ss);
			change(1,1,1,x*-1);
		}
		else if(r==4)
		{
			read(x);read(y);
			printf("%lld\n",ask(1,x,y));
		}
		else 
		{
			printf("%lld\n",ask(1,1,1));
		}
	}
	return 0;
}
2021/8/31 20:40
加载中...