社区讨论
最后三个点WA了,求助
P3372【模板】线段树 1参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mi7xudtx
- 此快照首次捕获于
- 2025/11/21 05:23 4 个月前
- 此快照最后确认于
- 2025/11/21 05:23 4 个月前
发现其他人三个点WA,都跟我写的不一样。
我是打上懒标记之后,并没有下传,直接查询的时候累计。
代码如下
CPP#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 4000000 + 10;
int n, m;
int num[maxn];
int maxv[maxn], minv[maxn], addv[maxn];
long long sum[maxn];
void Build(int x, int L, int R)
{
if (L == R)
{
sum[x] = maxv[x] = minv[x] = num[L];
return;
}
int M = (L + R) >> 1;
Build(2 * x, L, M);
Build(2 * x + 1, M + 1, R);
sum[x] = sum[2 * x] + sum[2 * x + 1];
maxv[x] = max(maxv[2 * x], maxv[2 * x + 1]);
minv[x] = min(minv[2 * x], minv[2 * x + 1]);
}
long long qury_sum(int x, int L, int R, int l, int r, int add)
{
if (l <= L && R <= r)
{
return sum[x] + add * (R - L + 1);
}
add += addv[x];
int M = (L + R) >> 1;
if (r <= M)
return qury_sum(2 * x, L, M, l, r, add);
if (M + 1 <= l)
return qury_sum(2 * x + 1, M + 1, R, l, r, add);
return qury_sum(2 * x, L, M, l, r, add) + qury_sum(2 * x + 1, M + 1, R, l, r, add);
}
void maintain(int x, int L, int R)
{
sum[x] = maxv[x] = minv[x] = 0;
if (L < R)
{
sum[x] = sum[2 * x] + sum[2 * x + 1];
maxv[x] = max(maxv[2 * x], maxv[2 * x + 1]);
minv[x] = min(minv[2 * x], minv[2 * x + 1]);
}
else
{
sum[x] = maxv[x] = minv[x] = num[L];
}
sum[x] += addv[x] * (R - L + 1);
maxv[x] += addv[x];
minv[x] += addv[x];
}
void upd(int x, int L, int R, int l, int r, int v)
{
if (l <= L && R <= r)
{
addv[x] += v;
}
else
{
int M = (L + R) >> 1;
if (l <= M) upd(2 * x, L, M, l, r, v);
if (M + 1 <= r) upd(2 * x + 1, M + 1, R, l, r, v);
}
maintain(x, L, R);
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
cin >> num[i];
}
Build(1, 1, n);
/* for (int i = 1; i <= n; i++)
{
for (int j = i; j <= n; j++)
{
printf("%d %d:\n", i, j);
// printf("max = %d\n", qury_mx(1, 1, n, i, j));
printf("sum = %lld\n", qury_sum(1, 1, n, i, j, 0));
// getchar();
}
} */
for (int i = 0; i < m; i++)
{
int temp = 0; cin >> temp;
if (temp == 1)
{
int l = 0, r = 0, k = 0; cin >> l >> r >> k;
upd(1, 1, n, l, r, k);
}
else if (temp == 2)
{
int l = 0, r = 0; cin >> l >> r;
cout << qury_sum(1, 1, n, l, r, 0) << '\n';
}
}
getchar(); getchar();
return 0;
}
求求大佬们救救我吧(可怜.jpg
回复
共 2 条回复,欢迎继续交流。
正在加载回复...