蒟蒻求助线段树
  • 板块学术版
  • 楼主cmll02
  • 当前回复5
  • 已保存回复5
  • 发布时间2020/9/5 14:05
  • 上次更新2023/11/5 13:42:39
查看原帖
蒟蒻求助线段树
171487
cmll02楼主2020/9/5 14:05

关于线段树:

看到大部分大佬都是用lazytag做的。。

但是我以前一直学的是直接记录附加值……?

就是这种:

inline void build(int n)
{
	//Sn是不小于n的最小2的整数幂
	for (int i = 1; i <= n; i++)
	{
		addv[i + Sn - 1] = QAQ[i];
	}
	for (int i = Sn - 1; i; i--)sum[i] = (addv[i << 1] + addv[(i << 1) ^ 1]) % mod;
}
int res;
inline void query(int u, int l, int r, int L, int R, int adds)
{
	if (L <= l&&r <= R){ res += sum[u] + ((addv[u] + adds) * (r - l + 1)); res %= mod; return; }
	else
	{
		int M = l + (r - l) / 2;
		if (L <= M)query(u << 1, l, M, L, R, (adds + addv[u]) % mod);
		if (R > M)query((u << 1) ^ 1, M + 1, r, L, R, (adds + addv[u]) % mod);
	}
}
#define min(a,b) (a>b?b:a)
#define max(a,b) (a<b?b:a)
inline void update(int u, int l, int r, int L, int R, int k){
	if (L <= l&&r <= R)
	{
		addv[u] += k;
		addv[u] %= mod;
	}
	else
	{
		int mid = l + (r - l) / 2;
		if (L <= mid)update(u<<1,l,mid, L, R, k);
		if (R>mid)update((u << 1) ^ 1, mid+1, r, L, R, k);
		sum[u] = (sum[u] + k*(1+min(r, R) - max(l, L))) % mod;
	}
}

主要想问:

这种写法的常数和lazytag相比哪个小?

求大佬解答CCCCCCCCCCCCCCCCCCCCOrz

2020/9/5 14:05
加载中...