线段树到底为啥要下放懒标记
  • 板块学术版
  • 楼主xyvsvg
  • 当前回复18
  • 已保存回复18
  • 发布时间2023/5/3 18:03
  • 上次更新2023/10/23 16:45:29
查看原帖
线段树到底为啥要下放懒标记
807950
xyvsvg楼主2023/5/3 18:03

rt,这是我的代码,通过了测试

#include<iostream>
#include<stack>
#include<string.h>
#include<cmath>
#include<iomanip>
#include<algorithm>
#include<climits>
#include<cstdio>
#include<vector>
#include<sstream>
#include<ctype.h>
#include<set>
#include<map>
#include<ctime>
#include<stdlib.h>
#include<queue>
#include<bitset>
#define usi unsigned int
#define ull unsigned long long
using namespace std;
template<typename TTT>inline void mr(TTT& theNumberToRead)
{
	theNumberToRead = 0;
	bool prn = false;
	char c = getchar();
	while (!isdigit(c))
	{
		if (c == '-')prn = true;
		c = getchar();
	}
	while (isdigit(c))
		theNumberToRead = 10 * theNumberToRead + (c ^ 48), c = getchar();
	if (prn)
		theNumberToRead = -theNumberToRead;
}
template<typename TTT>inline TTT mrr()
{
	TTT theNumberToRead = 0;
	bool prn = false;
	char c = getchar();
	while (!isdigit(c))
	{
		if (c == '-')prn = true;
		c = getchar();
	}
	while (isdigit(c))
		theNumberToRead = 10 * theNumberToRead + (c ^ 48), c = getchar();
	return prn ? -theNumberToRead : theNumberToRead;
}
template<typename T>void my_write(T x)
{
	if (x)
		my_write(x / 10),
		putchar(x % 10 ^ 48);
}
template<typename T>void mw(T x, char mid)
{
	if (x)
	{
		if (x < 0)
			putchar('-'),
			x = -x;
		my_write(x);
	}
	else putchar(48);
	if (mid)
		putchar(mid);
}
// ******************************************华丽的分割线******************************************
// ******************************************华丽的分割线******************************************
// ******************************************华丽的分割线******************************************
// ******************************************华丽的分割线******************************************
// ******************************************华丽的分割线******************************************
#define int long long
struct xzz
{
	int ans = 0, tag = 0;
}dat[1 << 18];
int n2 = 1;
inline int ls(int x)
{
	return x << 1;
}
inline int rs(int x)
{
	return x << 1 | 1;
}
inline void up(int x)
{
	dat[x].ans = dat[ls(x)].ans + dat[rs(x)].ans;
}
void build(int n)
{
	while (n2 < n)
		n2 <<= 1;
	for (int i = n2; i < n2 + n; ++i)
		mr(dat[i].ans);
	for (int i = n2 - 1; i; --i)
		up(i);
}
void update(int a, int b, int k, int p, int l, int r)
{
	if (b<l || a>r)
		return;
	if (a <= l && r <= b)
		dat[k].tag += p, dat[k].ans += (r - l + 1) * p;
	else
	{
		update(a, b, ls(k), p, l, l + r >> 1);
		update(a, b, rs(k), p, (l + r >> 1) + 1, r);
		up(k);
		dat[k].ans += dat[k].tag * (r - l + 1);
	}
}
int query(int a, int b, int k, int l, int r)
{
	if (b<l || a>r)
		return 0;
	if (a <= l && r <= b)
		return dat[k].ans;
	return query(a, b, ls(k), l, l + r >> 1) + query(a, b, rs(k), (l + r >> 1) + 1, r) +
		dat[k].tag * (min(b, r) - max(a, l) + 1);
}
signed main()
{
	int n, m;
	mr(n), mr(m);
	build(n);
	while (m--)
	{
		int o, x, y, k;
		mr(o), mr(x), mr(y);
		if (o == 1)
		{
			mr(k);
			update(x, y, 1, k, 1, n2);
		}
		else
			mw(query(x, y, 1, 1, n2), '\n');
	}
	return 0;
}
2023/5/3 18:03
加载中...