题目: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 条评论

目前还没有评论...