蒟蒻又双叒叕来求助线段树了QAQ
  • 板块学术版
  • 楼主cmll02
  • 当前回复16
  • 已保存回复16
  • 发布时间2020/9/6 09:13
  • 上次更新2023/11/5 13:39:13
查看原帖
蒟蒻又双叒叕来求助线段树了QAQ
171487
cmll02楼主2020/9/6 09:13

昨天其实发过帖子,但是仍然有一些疑惑。

看到很多dalao都是用lazytag的,但是我这个菜鸡不会,

写出这么个东西

int addv[400005], sum[400005];
int Sn;
int GetLength(int t)
{
	int p = 1;
	while (p < t)p <<= 1ll;
	return p;
}
inline void build(int n)
{
	Sn = GetLength(n);//*
	for (int i = 1; i <= n; i++)
	{
		addv[i + Sn - 1] = QAQ[i];
	}
	for (int i = Sn - 1; i; i--)sum[i] = (sum[i<<1] + sum[(i<<1)^1] + 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;
	}
}区间加/求和
  1. * 处,对于 n=5n=5 时叶节点仍然要开到 88,如何优化?主要是建树不会写,build 函数不想用递归来写。

  2. 【模板】线段树2用lazytag是可以做的,那么用这种奇奇怪怪的做法魔改之后可以吗……

  3. 给出两种操作

  • [l,r][l,r] 中的数全部改为 xx

  • [l,r][l,r] 中的数全部加上 xx

  • [l,r][l,r] 中的最大值、最小值、和。

这个用这种奇奇怪怪的做法是可以做的,用lazytag可以吗?

  1. 烤肠上写线段树推荐写哪种?

求大佬解答 Orz Orz Orz

2020/9/6 09:13
加载中...