【求助】线段树0分求调(RE)
  • 板块P2357 守墓人
  • 楼主lunjiahao
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/1/5 22:35
  • 上次更新2024/1/6 10:18:03
查看原帖
【求助】线段树0分求调(RE)
779970
lunjiahao楼主2024/1/5 22:35
#include<bits/stdc++.h>
#define ll long long
#define ls u<<1
#define rs u<<1|1
using namespace std;
const int N=2e5+5;
int n,Q,a[N],sum;
ll t[N<<2],tag[N<<2];
void build(int u,int l,int r)
{
	tag[u]=0;
	if(l==r)
	{
		t[u]=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(ls,1,mid);
	build(rs,mid+1,r);
	t[u]=t[ls]+t[rs];
}
void f(ll k,int u,int l,int r)
{
	tag[u]+=k;
	t[u]+=k*(r-l+1);
}
void push_down(int u,int l,int mid,int r)
{
	f(tag[u],ls,l,mid);
	f(tag[u],rs,mid+1,r);
	tag[u]=0;
}
void update(int u,int l,int r,int x,int y,ll k)
{
	if(y<l||r<x) return;
	if(x<=l&&r<=y)
	{
		tag[u]+=k;
		t[u]+=k*(r-l+1);
		return;
	}
	int mid=(l+r)>>1;
	if(tag[u]) push_down(u,l,mid,r);
	if(x<=mid) update(ls,l,mid,x,y,k);
	if(y>mid) update(rs,mid+1,r,x,y,k);
	t[u]=t[ls]+t[rs];
}
ll query(int u,int l,int r,int x,int y)
{
	ll res=0;
	if(y<l||r<x) return 0;
	if(x<=l&&r<=y) return t[u];
	int mid=(l+r)>>1;
	res=0;
	if(tag[u]) push_down(u,l,mid,r);
	if(x<=mid) res+=query(ls,l,mid,x,y);
	if(y>mid) res+=query(rs,mid+1,r,x,y);
	t[u]=t[ls]+t[rs];
	return res;
}
int main()
{
	scanf("%d%d",&n,&Q);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	build(1,1,n);
	while(Q--)
	{
		int opt,x,y,k;
		scanf("%d",&opt);
		if(opt==1)
		{
			scanf("%d%d%d",&x,&y,&k);
			update(1,1,n,x,y,k);
		}
		if(opt==2)
		{
			scanf("%d",&k);
			sum+=k;
		}
		if(opt==3)
		{
			scanf("%d",&k);
			sum-=k;
		}
		if(opt==4)
		{
			scanf("%d%d",&x,&y); 
			printf("%lld\n",query(1,1,n,x,y)+(x==1)*sum);
		}
		if(opt==5)
			printf("%lld\n",query(1,1,n,1,1)+sum);
	}
	return 0;
}

测评记录

2024/1/5 22:35
加载中...