线段树28pts求助
  • 板块P2357 守墓人
  • 楼主IQ勇士
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/10/29 09:01
  • 上次更新2023/10/27 05:15:20
查看原帖
线段树28pts求助
158652
IQ勇士楼主2022/10/29 09:01

RT,开了long long还是见了祖宗

#include<iostream>
#include<cstdio>
using namespace std;
inline long long readin()
{
	long long x = 0;
	char c = getchar();
	while(c < '0' || c > '9')
		c = getchar();
	while(c >= '0' && c <= '9')
	{
		x = (x << 3) + (x << 1) + c - '0';
		c = getchar();
	}
	return x;
}
long long sum[800001], tag[800001], a[200001], n, m, op, aa, bb, cc;
void pushup(int index)
{
	sum[index] = sum[index * 2] + sum[index * 2 + 1];
}
void build(int l, int r, int index)
{
	if(l == r)
	{
		sum[index] = a[l];
		return;
	}
	int m = (l + r) / 2;
	build(l, m, index * 2);
	build(m + 1, r, index * 2 + 1);
	pushup(index);
}
bool qb(int l1, int r1, int l2, int r2)
{
	return l1 <= l2 && r1 >= r2;
}
bool noj(int l1, int r1, int l2, int r2)
{
	return l1 > r2 || l2 > r1;
}
void tagging(int l, int r, int index, long long x)
{
	tag[index] += x;
	sum[index] += (r - l + 1) * x;
}
void pushdown(int l, int r, int index)
{
	int m = (l + r) / 2;
	tagging(l, m, index * 2, tag[index]);
	tagging(m + 1, r, index * 2 + 1, tag[index]);
	tag[index] = 0;
}
void xg(int L, int R, int l, int r, int index, long long x)
{
	if(qb(L, R, l, r))
	{
		tagging(l, r, index, x);
		return;
	}
	if(!noj(L, R, l, r))
	{
		pushdown(l, r, index);
		int m = (l + r) / 2;
		xg(L, R, l, m, index * 2, x);
		xg(L, R, m + 1, r, index * 2 + 1, x);
		pushup(index);
	}
}
long long query(int L, int R, int l, int r, int index)
{
	if(qb(L, R, l, r))
		return sum[index];
	if(noj(L, R, l, r))
		return 0;
	pushdown(l, r, index);
	int m = (l + r) / 2;
	return query(L, R, l, m, index * 2) + query(L, R, m + 1, r, index * 2 + 1);
}
void print(int index, int l, int r)
{
	cout << index << ' ' << sum[index] << ' ' << tag[index] << endl;
	if(l == r)
		return;
	int m = (l + r) / 2;
	print(index * 2, l, m);
	print(index * 2 + 1, m + 1, r);
}
int main()
{
	n = readin();
	m = readin();
	for(int i = 1; i <= n; i++)
		a[i] = readin();
	build(1, n, 1);
	for(int i = 1; i <= m; i++)
	{
		op = readin();
		if(op == 1)
		{
			aa = readin();
			bb = readin();
			cc = readin();
			xg(aa, bb, 1, n, 1, cc);
		}
		if(op == 2)
		{
			aa = readin();
			xg(1, 1, 1, n, 1, aa);
		}
		if(op == 3)
		{
			aa = readin();
			xg(1, 1, 1, n, 1, -aa);
		}
		if(op == 4)
		{
			aa = readin();
			bb = readin();
			printf("%d\n", query(aa, bb, 1, n, 1));
		}
		if(op == 5)
		{
			printf("%d\n", query(1, 1, 1, n, 1));
		}
//		print(1, 1, n);
	}
	return 0;
}
2022/10/29 09:01
加载中...