社区讨论
调了两小时了,求教闭关
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 条回复,欢迎继续交流。
正在加载回复...