昨天其实发过帖子,但是仍然有一些疑惑。
看到很多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;
}
}区间加/求和
* 处,对于 n=5 时叶节点仍然要开到 8,如何优化?主要是建树不会写,build
函数不想用递归来写。
【模板】线段树2用lazytag是可以做的,那么用这种奇奇怪怪的做法魔改之后可以吗……
给出两种操作
把 [l,r] 中的数全部改为 x
把 [l,r] 中的数全部加上 x
求 [l,r] 中的最大值、最小值、和。
这个用这种奇奇怪怪的做法是可以做的,用lazytag可以吗?
求大佬解答 Orz Orz Orz