求助线段树,全wa了
  • 板块P2357 守墓人
  • 楼主platfi
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/5/12 15:18
  • 上次更新2023/10/23 16:02:13
查看原帖
求助线段树,全wa了
497025
platfi楼主2023/5/12 15:18
#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef struct unit{
	int l,r;
	int sum;
	int po=0;
}node;
int a[200005];
node t[800005];
void build(int x,int l,int r);
void add(int l,int r,int k,int x);
void change(int x,int p,int k);
void ask(int x,int p);
void spread(int x);
int toji(int l,int r,int x);
signed main()
{
	int n,f;
	cin>>n>>f;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	build(1,1,n);
	int y,l,r,k;
	while(f--)
	{
		cin>>y;
		if(y==1)
			{
				cin>>l>>r>>k;
				add(l,r,k,1);
			}
		else if(y==2)
			{
				cin>>k;
				change(1,1,k);
			}
		else if(y==3)
			{
				cin>>k;
				change(1,1,-k);
			}
		else if(y==4)
			{
				cin>>l>>r;
				int ans=toji(l,r,1);
				cout<<ans<<endl;
			}
		else if(y==5)
			{
				ask(1,1);
			}
	}
}
void build(int x,int l,int r)
{
	t[x].l=l;
	t[x].r=r;
	if(l==r)
		{
			t[p].sum=a[l];return;
		}
	int mid=(l+r)/2;
	build(x*2,l,mid);
	build(x*2+1,mid+1,r);
	t[x].sum=t[x*2].sum+t[x*2+1].sum;
}
void add(int l,int r,int k,int x)
{
	if(t[x].r<l||t[x].l>r)return;
	if(l<=t[x].l&&r>=t[x].r)
	{
		t[x].sum+=k*(t[x].r-t[x].l+1);
		t[x].po+=k;
		return;
	}
	spread(x);
	int mid=(t[x].l+t[x].r)/2;
	if(l<=mid)add(l,mid,k,x*2);
	if(r>mid)add(mid+1,r,k,x*2+1);
	t[x].sum=t[x*2].sum+t[x*2+1].sum;
}
void change(int p,int x,int k)
{
	t[x].sum+=k;
	if(t[x].l==t[x].r){
		return;
	}
	int mid=(t[x].l+t[x].r)/2;
	if(p<=mid)change(p,x*2,k);
	else change(p,x*2+1,k);
}
void ask(int x,int p)
{
	spread(p);
	if(t[p].l==t[p].r)
	{
		cout<<t[p].sum<<endl;
		return;
	}
	int mid=(t[p].l+t[p].r)/2;
	if(x<=mid)ask(x,p*2);
	else ask(x,p*2+1);
}
void spread(int x)
{
	if(t[x].po)
		{
			int mid=(t[x].l+t[x].r)/2;
			t[x*2].sum+=t[x].po*(mid-t[x].l+1);
			t[x*2+1].sum+=t[x].po*(t[x].r-mid);
			t[x*2].po+=t[x].po;
			t[x*2+1].po+=t[x].po;
			t[x].po=0;
		}
}
int toji(int l,int r,int x)
{

	if(t[x].l>=l&&t[x].r<=r)return t[x].sum;
	if(r<t[x].l||l>t[x].r)return 0;	
	spread(x);	
	int mid=(t[x].l+t[x].r)/2;
	int ans=0;
	if(r>mid)ans+=toji(l,r,x*2+1);
	if(l<=mid)ans+=toji(l,r,x*2);
	return ans;
}
2023/5/12 15:18
加载中...