最后三个点TLE,用了懒标记,求教
查看原帖
最后三个点TLE,用了懒标记,求教
680697
lv__sc楼主2023/4/29 14:37
#include <bits/stdc++.h>

using namespace std;
typedef long long LL;
typedef unsigned long long u64;
typedef pair<int, int> PII;
const int N = 1e5 + 10;
const int mod = 1e9 + 7;

//Segment Tree
int n, m;
LL a[N];

struct info
{
    LL sum, tag;
};

struct node
{
    info val;
} seg[N * 4];

void update(int id)
{
    seg[id].val.sum = seg[id * 2].val.sum + seg[id * 2 + 1].val.sum;
}


void build(int id, int l, int r)
{
    if (l == r) seg[id].val = {a[l], 0};
    else
    {
        int mid = (l + r) / 2;
        build(id * 2, l, mid);
        build(id * 2 + 1, mid + 1, r);
        update(id);
    }
}

void settag(int id, LL t, int len)
{
    seg[id].val.sum += (t * (LL) len);
    seg[id].val.tag += t;
}

void pushdown(int id, int l, int r)
{
    if (seg[id].val.tag != 0)
    {
        int mid = (l + r) / 2;
        settag(id * 2, seg[id].val.tag, mid - l + 1);
        settag(id * 2 + 1, seg[id].val.tag, r - mid);
        seg[id].val.tag = 0;
    }
}

void modify(int id, int l, int r, int ql, int qr, LL t)
{
    if (l == ql && r == qr)
    {
        settag(id, t, r - l + 1);
        return;
    }
    pushdown(id, l, r);
    int mid = (l + r) / 2;
    if (qr <= mid) modify(id * 2, l, mid, ql, qr, t);
    else if (ql > mid) modify(id * 2 + 1, mid + 1, r, ql, qr, t);
    else
    {
        modify(id * 2, l, mid, ql, mid, t);
        modify(id * 2 + 1, mid + 1, r, mid + 1, qr, t);
    }
    update(id);
}

LL query(int id, int l, int r, int ql, int qr)
{
    if (l == r) return seg[id].val.sum;
    pushdown(id, l, r);
    int mid = (l + r) / 2;
    if (qr <= mid) return query(id * 2, l, mid, ql, qr);
    else if (ql > mid) return query(id * 2 + 1, mid + 1, r, ql, qr);
    else
    {
        return (query(id * 2, l, mid, ql, mid)
                + query(id * 2 + 1, mid + 1, r, mid + 1, qr));
    }
}


int main()
{
//    std::ios::sync_with_stdio(false);
//    std::cin.tie(nullptr);
//    std::cout.tie(nullptr);

    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++)
    {
        //cin >> a[i];
        scanf("%lld", &a[i]);
    }
    build(1, 1, n);
    while (m--)
    {
        int op;
        scanf("%d", &op);
        if (op == 1)
        {
            int x, y, k;
            //cin >> x >> y >> k;
            scanf("%d%d%d", &x, &y, &k);
            modify(1, 1, n, x, y, k);
        } else
        {
            int x, y;
            //cin >> x >> y;
            scanf("%d%d", &x, &y);
            printf("%lld\n", query(1, 1, n, x, y));
        }
    }

    return 0;
}
2023/4/29 14:37
加载中...