求助,为什么会出现负数,开了longlong
查看原帖
求助,为什么会出现负数,开了longlong
167279
Danno0v0楼主2021/8/26 08:18

WA了8910三个点,检查一遍把所有int都改成了ll,但是还是在8910中会输出一个负数

#include<bits/stdc++.h>
#define ll long long
#define MAX 200000
using namespace std;
ll num[200001];
struct node
{
	ll l,r,tot,add;
}tree[MAX*4];
void link(int n)
{
	tree[n].tot=tree[n*2].tot+tree[n*2+1].tot;
}
void spread(int n)
{
	tree[n*2].tot+=tree[n].add*(tree[n*2].r-tree[n*2].l+1);
	tree[n*2+1].tot+=tree[n].add*(tree[n*2+1].r-tree[n*2+1].l+1);
	tree[n*2].add+=tree[n].add;
	tree[n*2+1].add+=tree[n].add;
	tree[n].add=0;
}
void build(int n,int le,int ri)
{
	tree[n].l=le;
	tree[n].r=ri;
	if(le==ri)
	{
		tree[n].tot=num[le];
		return;
	}
	ll mid=(le+ri)>>1;
	build(n*2,le,mid);
	build(n*2+1,mid+1,ri);
	link(n);
}
void change(int n,int le,int ri,int d)
{
	if(tree[n].l>=le&&tree[n].r<=ri)
	{
		tree[n].tot+=d*(tree[n].r-tree[n].l+1);
		tree[n].add+=d;
		return;
	}
	spread(n);
	ll mid=(tree[n].l+tree[n].r)>>1;
	if(le<=mid)
	{
		change(n*2,le,ri,d);
	}
	if(ri>mid)
	{
		change(n*2+1,le,ri,d);
	}
	link(n);
}
int ask(int n,int le,int ri)
{
	if(tree[n].l>=le&&tree[n].r<=ri)
	{
		return tree[n].tot;
	}
	spread(n);
	ll res=0,mid=(tree[n].l+tree[n].r)>>1;
	if(le<=mid)
	{
		res+=ask(n*2,le,ri);
	}
	if(ri>mid)
	{
		res+=ask(n*2+1,le,ri);
	}
	return res;
}
int main()
{
	ll n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&num[i]);
	}
	build(1,1,n);
	ll x,y,z,q;
	for(ll i=1;i<=m;i++)
	{
		cin>>x;
		if(x==1)
		{
			cin>>y>>z>>q;
			change(1,y,z,q);
		}
		if(x==2)
		{
			cin>>y>>z;
			cout<<ask(1,y,z)<<endl;
		}
	}
	return 0;
}
2021/8/26 08:18
加载中...