社区讨论

板子写炸了,求调,悬1关注

P3372【模板】线段树 1参与者 3已保存回复 10

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
10 条
当前快照
1 份
快照标识符
@m2jpjktq
此快照首次捕获于
2024/10/22 08:28
去年
此快照最后确认于
2024/10/22 08:40
去年
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 5;
int n,m,ci,x,y,k,a[N],ans[N << 2],tag[N << 2];
void push_up(int p)
{
	ans[p] = ans[p << 1] + a[p << 1 | 1];
}
void build(int p,int l,int r)
{
	if (l == r)
	{
		ans[p] = a[l];
		return;
	}
	int mid = (l + r) >> 1;
	build(p << 1,l,mid);
	build(p << 1 | 1,mid + 1,r);
	push_up(p);
}
void mark(int p,int l,int r,int k)
{
	tag[p] += k;
	ans[p] += k * (r - l + 1);
}
void push_down(int p,int l,int r)
{
	int mid = (l + r) >> 1;
	mark(p << 1,l,mid,tag[p]);
	mark(p << 1 | 1,mid + 1,r,tag[p]);
	tag[p] = 0;
}
void update(int target1,int target2,int l,int r,int p,int k)
{
	if (target1 <= l && r <= target2)
	{
		mark(p,l,r,k);
		return;
	}
	push_down(p,l,r);
	int mid = (l + r) >> 1;
	if (target1 <= mid)
		update(target1,target2,l,mid,p << 1,k);
	if (target2 > mid)
		update(target1,target2,mid + 1,r,p << 1 | 1,k);
	push_up(p);
}
int query(int target1,int target2,int l,int r,int p)
{
	int s = 0;
	if (target1 <= l && r <= target2)
		return ans[p];
	int mid = (l + r) >> 1;
	push_down(p,l,r);
	if (target1 <= mid)
		s += query(target1,target2,l,mid,p << 1);
	if (target2 > mid)
		s += query(target1,target2,mid + 1,r,p << 1 | 1);
	return s;
}
signed main()
{
	cin >> n >> m;
	for (int i = 1;i <= n;i++)
		cin >> a[i];
	build(1,1,n);
	while (m--)
	{
		cin >> ci >> x >> y;
		if (ci == 1)
		{
			cin >> k;
			update(x,y,1,n,1,k);
		}
		else
			cout << query(x,y,1,n,1) << endl;
	}
	return 0;
}

回复

10 条回复,欢迎继续交流。

正在加载回复...