P2357守墓人线段树抱灵
  • 板块学术版
  • 楼主Janokay
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/8/19 22:17
  • 上次更新2023/10/27 14:31:26
查看原帖
P2357守墓人线段树抱灵
477588
Janokay楼主2022/8/19 22:17
#include <cstring>
#include <climits>
#include <iostream>
#include <algorithm>
#define l(u) (u << 1)
#define r(u) (u << 1 | 1)
#define len(l, r) (r - l + 1)

using namespace std;
using LL = long long;
const int N = 2e5 + 10;
const LL inf = LONG_LONG_MAX;

LL n, f;
LL init[N];

struct Tree
{
    LL l, r;
    LL add, sum;
}tr[N << 2];

inline void pushup(LL u)
{
    tr[u].sum = tr[l(u)].sum + tr[r(u)].sum;
}

inline void pushdown(LL u)
{
    LL& x = tr[u].add;
    if (x)
    {
        tr[l(u)].sum = len(tr[l(u)].l, tr[l(u)].r) * x;
        tr[r(u)].sum = len(tr[r(u)].l, tr[r(u)].r) * x;
        tr[l(u)].add += x;
        tr[r(u)].add += x;
        x = 0;
    }
}

inline void build(LL u, LL l, LL r)
{
    if ( l == r ) tr[u] = {l, r, 0, init[r]};
    else {
        tr[u] = {l, r};
        int mid = (tr[u].r + tr[u].l) >> 1;
        build(u << 1, l, mid); build(u << 1 | 1, mid + 1, r);
        pushup(u);
    }
}

inline LL ask(LL u, LL l, LL r)
{
    if (tr[u].l >= l && tr[u].r <= r)
        return tr[u].sum;
    pushdown(u);
    LL mid = tr[u].l + tr[u].r >> 1;
    LL res = 0;
    if (mid >= l) res += ask(u << 1, l, r);
    if (mid < r) res += ask(u << 1 | 1, l, r);
    return res;
}

inline void add(LL u, LL l, LL r, LL k)
{
    if (tr[u].l >= l && tr[u].r <= r)
        tr[u].add += k, tr[u].sum += len(tr[u].l, tr[u].r) * k;
    else
    {
        pushdown(u);
        LL mid = tr[u].l + tr[u].r >> 1;
        if (mid >= l) add(l(u), l, r, k);
        if (mid < r) add(r(u), l, r, k);
        pushup(u);
    }
}

int main(void)
{
    scanf("%lld%lld", &n, &f);
    for (register LL i = 1; i <= n; i ++ ) scanf("%lld", &init[i]);
    build(1ll, 1ll, n);
    LL op, l, r, k;
    while (f -- )
    {
        scanf("%lld", &op);
        if (op == 1)
        {
            scanf("%lld%lld%lld", &l, &r, &k);
            add(1, l, r, k);
        }
        else 
            if (op == 2)
                scanf("%lld", &k),
                add(1, 1, 1, k);
            else
                if (op == 3)
                    scanf("%lld", &k),
                    add(1, 1, 1, -k);
                else 
                    if (op == 4)
                        scanf("%lld%lld", &l, &r),
                        printf("%lld\n", ask(1, l, r));
                    else
                        printf("%lld", ask(1, 1, 1));
    }
    return (0);
}

样例过了,但是全WA,不太明白是哪里出了问题,求奆佬赐教

2022/8/19 22:17
加载中...