社区讨论

调了两小时了,求教闭关

P13825【模板】线段树 1.5参与者 6已保存回复 29

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
27 条
当前快照
1 份
快照标识符
@mknnmq7m
此快照首次捕获于
2026/01/21 14:41
4 周前
此快照最后确认于
2026/01/24 18:25
4 周前
查看原帖
CPP
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll n, m, op, l, r, k, cnt = 1;
ll ls[400005], rs[400005], a[400005], tg[400005];
void add(ll l, ll r, ll k, ll ql, ll qr, ll id)
{
    // cout << ql << " " << qr << " " << a[id] << " " << tg[id] << endl;
    if (ql == qr)
    {
        a[id] += k;
        return;
    }
    if (l == ql && r == qr)
    {
        tg[id] += k;
        return;
    }
    ll mid = (ql + qr) / 2;
    if (!ls[id]) ls[id] = ++cnt;
    if (!rs[id]) rs[id] = ++cnt;
    if (r <= mid) add(l, r, k, ql, mid, ls[id]);
    else if (mid + 1 <= l) add(l, r, k, mid + 1, qr, rs[id]);
    else
    {
        add(l, mid, k, ql, mid, ls[id]);
        add(mid + 1, r, k, mid + 1, qr, rs[id]);
    }
    a[id] = a[ls[id]] + a[rs[id]];
}
ll qry(ll l, ll r, ll ql, ll qr, ll id)
{
    // cout << ql << " " << qr << " " << a[id] << " " << tg[id] << endl;
    if (ql == qr) return a[id] + tg[id];
    if (l == ql && r == qr) return a[id] + tg[id] * (r - l + 1);
    ll mid = (ql + qr) / 2;
    if (!ls[id]) ls[id] = ++cnt;
    if (!rs[id]) rs[id] = ++cnt;
    tg[ls[id]] += tg[id];
    tg[rs[id]] += tg[id];
    tg[id] = 0;
    if (r <= mid) return qry(l, r, ql, mid, ls[id]);
    else if (mid + 1 <= l) return qry(l, r, mid + 1, qr, rs[id]);
    else return qry(l, mid, ql, mid, ls[id]) + qry(mid + 1, r, mid + 1, qr, rs[id]);
}
int main()
{
    // freopen(".in", "r", stdin);
    // freopen(".out", "w", stdout);
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    cin >> n >> m;
    while (m--)
    {
        cin >> op >> l >> r;
        if (op == 1)
        {
            cin >> k;
            add(l, r, k, 1, n, 1);
        }
        else
        {
            cout << qry(l, r, 1, n, 1) + (l + r) * (r - l + 1) / 2 << endl;
        }
    }
    return 0;
}

回复

29 条回复,欢迎继续交流。

正在加载回复...