求助各位大佬,最后三个点re了
查看原帖
求助各位大佬,最后三个点re了
404773
Abel2333楼主2020/11/4 00:17

正常来说4倍空间就够了,但是我开4倍空间的话,最后三个点re,只有开8倍空间才ac,这是为啥啊 以下是代码

#include <cstdio>
#include <iostream>
#define ll long long
#define MAXN 100005
using namespace std;

struct node
{
    ll l, r;
    ll sum;
    ll lazy;
} tree[4*MAXN];

int arry[MAXN];

void updateNode(int x)
{
    tree[x].sum = tree[2 * x].sum + tree[2 * x + 1].sum;
}

void build(int lf, int rg, int n)
{
    tree[n].l = lf;
    tree[n].r = rg;
    tree[n].lazy = 0;
    if (lf == rg)
    {
        tree[n].sum = arry[lf];
        return;
    }
    int mid = (lf + rg) >> 1;
    build(lf, mid, 2 * n);
    build(mid + 1, rg, 2 * n + 1);
    updateNode(n);
}

void pushDown(int n)
{
    if (tree[n].lazy)
    {
        tree[2 * n].lazy += tree[n].lazy;
        tree[2 * n + 1].lazy += tree[n].lazy;

        tree[2 * n].sum += (ll)(tree[2 * n].r - tree[2 * n].l + 1) * tree[n].lazy;
        tree[2 * n + 1].sum += (ll)(tree[2 * n + 1].r - tree[2 * n + 1].l + 1) * tree[n].lazy;

        tree[n].lazy = 0;
    }
}

void updateInterval(int lf, int rg, int add, int n)
{
    if ((tree[n].l > rg) || (tree[n].r < lf))
        return;
    if (tree[n].l >= lf && tree[n].r <= rg)
    {
        tree[n].sum += (ll)add * (tree[n].r - tree[n].l + 1);
        tree[n].lazy += add;
        return;
    }
    pushDown(n);
    updateInterval(lf, rg, add, 2 * n);
    updateInterval(lf, rg, add, 2 * n + 1);
    updateNode(n);
}

ll quire(int lf, int rg, int n)
{
    if ((tree[n].l > rg) || (tree[n].r < lf))
        return 0;
    pushDown(n);
    if (tree[n].l >= lf && tree[n].r <= rg)
        return tree[n].sum;
    ll tmp = 0;
    tmp += quire(lf, rg, 2 * n);
    tmp += quire(lf, rg, 2 * n + 1);
    return tmp;
}

int main()
{
    int n, m;
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &arry[i]);
    }
    build(1, n, 1);
    for (int i = 0; i < m; i++)
    {
        int op = 0;
        scanf("%d", &op);
        if (op == 1)
        {
            int a, b, k;
            scanf("%d%d%d", &a, &b, &k);
            updateInterval(a, b, k, 1);
        }
        else if (op == 2)
        {
            int a, b;
            scanf("%d%d", &a, &b);
            printf("%lld\n", quire(a, b, 1));
        }
    }
    return 0;
}
2020/11/4 00:17
加载中...