社区讨论

最后三个点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 条回复,欢迎继续交流。

正在加载回复...