线段树0分求助
查看原帖
线段树0分求助
518232
Sternenlicht楼主2021/12/31 20:28
#include <map>
#include <queue>
#include <vector>
#include <cmath>
#include <cctype>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ls(x) x<<1
#define rs(x) x<<1|1
#define int long long
#define N 200100
using namespace std;

int n,m;
int tree[N<<2],lazy[N<<2],a[N];
void build(int k,int l,int r)
{
	lazy[k]=0;
	if (l==r)
	{
		tree[k]=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(ls(k),l,mid);
	build(rs(k),mid+1,r);
	tree[k]=tree[ls(k)]+tree[rs(k)];
}

void push_down(int k,int l,int r)
{
	int mid=(l+r)/2;
	tree[ls(k)]=tree[ls(k)]+lazy[k]*(mid-l+1);
	tree[rs(k)]=tree[rs(k)]+lazy[k]*(r-mid);
	lazy[ls(k)]=lazy[ls(k)]+lazy[k];
	lazy[rs(k)]=lazy[rs(k)]+lazy[k];
	lazy[k]=0;
}

void update(int k,int l,int r,int x,int y,int v)
{
	if (x<=l&&r<=y)
	{
		tree[k]=tree[k]+v*(r-l+1);
		lazy[k]=lazy[k]+v;
		return;
	}
	push_down(k,l,r);
	int mid=(l+r)/2;
	if (x<=mid)
	{
		update(ls(k),l,mid,x,y,v);
	}
	if (mid<y)
	{
		update(rs(k),mid+1,r,x,y,v);
	}
	tree[k]=tree[ls(k)]+tree[rs(k)];
}

int query(int k,int l,int r,int x,int y)
{
	if (x<=l&&r<=y)
	{
		return tree[k];
	}
	int mid=(l+r)/2;
	int ans=0;
	if (x<=mid)
	{
		ans+=query(ls(k),l,mid,x,y);
	}
	if (mid<y)
	{
		ans+=query(rs(k),mid+1,r,x,y);
	}
	return ans;
}

signed main()
{
	scanf("%lld%lld",&n,&m);
	for (int i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]);
	}
	build(1,1,n);
	for (int i=1;i<=m;i++)
	{
		int opt,x,y,z;
		scanf("%lld",&opt);
		if (opt==1)
		{
			scanf("%lld%lld%lld",&x,&y,&z);
			update(1,1,n,x,y,z);
		}
		if (opt==2)
		{
			scanf("%lld",&x);
			update(1,1,n,1,1,x);
		}
		if (opt==3)
		{
			scanf("%lld",&x);
			update(1,1,n,1,1,-x);
		}
		if (opt==4)
		{
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",query(1,1,n,x,y));
		}
		if (opt==5)
		{
			printf("%lld\n",query(1,1,n,1,1));
		}
	}
	return 0;
}

样例过了,自己也看不出哪有问题,求大佬帮忙调错

2021/12/31 20:28
加载中...