萌新提问,错误在哪
查看原帖
萌新提问,错误在哪
315772
Drystynt楼主2022/7/5 00:02
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define N 100001
#define L(x) x*2
#define R(x) x*2+1
int n,m;
struct seg
{
	int sum=0;
	int inc=0;
};
int a[N];
seg tr[4*N];
inline void push_up(int x)
{
	tr[x].sum=tr[L(x)].sum+tr[R(x)].sum;
	return;
}
inline void build(int l,int r,int x)
{
	if(l==r)	{tr[x].sum=a[l];return;}
	build(l,(l+r)/2,L(x));
	build((l+r)/2+1,r,R(x));
	push_up(x);
}
inline void f(int l,int r,int x,int k)
{
	tr[x].inc+=k;
	tr[x].sum+=k*(l-r+1);
}
inline void push_down(int l,int r,int x)
{
	int mid=(l+r)/2;
	f(l,mid,L(x),tr[x].inc);
	f(mid+1,r,R(x),tr[x].inc);
	tr[x].inc=0;
	
	return;
}
inline void upd(int ll,int rr,int l,int r,int x,int k)
{
	if(ll<=l && r<=rr) 
	{
		f(l,r,x,k);
		return;
	}
	push_down(l,r,x);
	int mid=(l+r)/2;
	if(ll<=mid) upd(ll,rr,l,mid,L(x),k);
	if(rr>=mid+1) upd(ll,rr,mid+1,r,R(x),k);
	push_up(x);
	return;
}
inline int SUM(int ll,int rr,int l,int r,int x)
{
	int ans=0;
	if(ll<=l && r<=rr) return tr[x].sum;
	push_down(l,r,x);
	int mid=(l+r)/2;
	if(ll<=mid) ans+=SUM(ll,rr,l,mid,L(x));
	if(rr>=mid+1) ans+=SUM(ll,rr,mid+1,r,R(x));	 
	push_up(x);
}
signed main()
{
	ios::sync_with_stdio(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,n,1);
	int t,l,r,k;
	while(m--)
	{
		cin>>t;
		if(t==1) 
		{
			cin>>l>>r>>k;
			upd(l,r,1,n,1,k);
		}
		if(t==2)
		{
			cin>>l>>r;
			cout<<SUM(l,r,1,n,1)<<endl;
		}
	}
	system("pause");
	return 0;
} 

感觉甚至有点照着题解搞的,但是不知道错误是什么

2022/7/5 00:02
加载中...