- 编程
来,我问道题
- 2025-3-24 12:07:12 @
题目:P11853
#3 RE,其余 AC 。做法:线段树
我的代码:
#define LAOSHI
#ifdef LAOSHI
#include <iostream>
#include <climits>
using namespace std;
#define ll long long
const ll N = 1e6 + 10;
struct node {
ll sum;
ll lazy;
} tree[4 * N];
ll a[N + 10];
void PushUp(ll x) {
tree[x].sum = tree[2 * x].sum + tree[2 * x + 1].sum;
}
void PushDown(ll x, ll l, ll r) {
ll m = (l + r) / 2;
tree[x * 2].lazy += tree[x].lazy;
tree[x * 2 + 1].lazy += tree[x].lazy;
tree[x * 2].sum += tree[x].lazy * (m - l + 1);
tree[x * 2 + 1].sum += tree[x].lazy * (r - m);
tree[x].lazy = 0;
}
void Build(ll x, ll l, ll r) {
tree[x].lazy = 0;
if (l == r) {
tree[x].sum = a[l];
return;
}
ll m = (l + r) / 2;
Build(2 * x, l, m);
Build(2 * x + 1, m + 1, r);
PushUp(x);
}
void Update(ll x, ll p, ll q, ll val, ll l, ll r) {
if (p <= l && r <= q) {
tree[x].lazy += val;
tree[x].sum += (r - l + 1) * val;
return;
}
PushDown(x, l, r);
ll m = (l + r) / 2;
if (p <= m) {
Update(2 * x, p, q, val, l, m);
}
if (q >= m + 1) {
Update(2 * x + 1, p, q, val, m + 1, r);
}
PushUp(x);
}
ll Query(ll x, ll p, ll q, ll l, ll r) {
if (p <= l && r <= q) {
return tree[x].sum;
}
PushDown(x, l, r);
ll m = (l + r) / 2;
ll res = 0;
if (p <= m) {
res += Query(2 * x, p, q, l, m);
}
if (q >= m + 1) {
res += Query(2 * x + 1, p, q, m + 1, r);
}
return res;
}
#endif
int main() {
Build(1, 1, N);
int n, l, r;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> l >> r;
Update(1, l, r, 1, 1, N);
}
ll ans = INT_MIN, tmp;
for (int i = 1; i <= N; i++) {
tmp = Query(1, i, i, 1, N);
ans = max(ans, tmp);
}
cout << ans;
return 0;
}
求条。
0 条评论
目前还没有评论...