求助,10分样例过了
查看原帖
求助,10分样例过了
1011297
Derrick_Rose楼主2023/8/23 11:19

除了第二个点全 WA 代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#define int long long
#define N 100100
using namespace std;
int n,m,a[N];
struct node
{
	int le,ri;
	int val,tag;
}T[N<<2];
void build(int i,int l,int r)
{
	T[i].le=l,T[i].ri=r;
	if(l==r)
	{
		T[i].val=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(i<<1,l,mid);
	build(i<<1|1,mid+1,r);
	T[i].val=T[i<<1].val+T[i<<1|1].val;
}
void pushdown(int i)
{
	T[i<<1].val+=(T[i<<1].ri-T[i<<1].le+1)*T[i].tag;
	T[i<<1|1].val+=(T[i<<1|1].ri-T[i<<1|1].le+1)*T[i].tag;
	T[i<<1].tag+=T[i].tag;
	T[i<<1|1].tag+=T[i].tag;
	T[i].tag=0;
}
void update(int i,int l,int r,int k)
{
	if(l<=T[i].le&&r>=T[i].ri)
	{
		T[i].tag+=k;
		T[i].val+=(T[i].ri-T[i].le+1)*k;
		return;
	}
	if(T[i].tag)pushdown(i);
	int mid=(T[i].le+T[i].ri)>>1;
	if(l<=mid)update(i<<1,l,r,k);
	if(r>=mid+1)update(i<<1|1,l,r,k);
	T[i].val=T[i<<1].val+T[i<<1|1].val;
}

int ask(int i,int l,int r)
{

	if(l<=T[i].le&&r>=T[i].ri)
		{
			return T[i].val;
		}
	if(T[i].tag)pushdown(i);
	int mid=(T[i].ri+T[i].le)>>1,ans=0;
	if(l<=mid)ans+=ask(i<<1,l,mid);
	if(r>=mid+1)ans+=ask(i<<1|1,mid+1,r);
	return ans;
}
signed main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		int q,x,y;
		cin>>q>>x>>y;
		if(q==1)
		{
			int k;
			cin>>k;
			update(1,x,y,k);
		}
		if(q==2)
		{
			cout<<ask(1,x,y)<<endl;
		}
	}
	return 0;
}
2023/8/23 11:19
加载中...