线段树RE 85pts玄关求调
  • 板块学术版
  • 楼主HappyJaPhy
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/7/23 10:37
  • 上次更新2024/7/23 11:27:20
查看原帖
线段树RE 85pts玄关求调
373905
HappyJaPhy楼主2024/7/23 10:37

题目

为什么会 RE ?我按照讨论版里的警示一个个调了一遍结果还是 RE 85pts。

#include <bits/stdc++.h>
#define ls(x) (x << 1)
#define rs(x) (x << 1 | 1)
#define int long long
#define N 500005
using namespace std;
int n, m, b[N], tot, maxn, ans = 0x7fffffff;

struct line {
	int l, r;
	bool operator <(const line &x)const {
		return (r - l) < (x.r - x.l);
	}
} a[N];

inline int read(int &x) {
	char ch = x = 0;
	int m = 1;
	while (ch < '0' || ch > '9') {
		ch = getchar();
		if (ch == '-') m *= -1;
	}
	while (ch >= '0' && ch <= '9') {
		x = (x << 1) + (x << 3) + ch - 48;
		ch = getchar();
	}
	x *= m;
	return x;
}

struct node {
	int maxn, tag;
};

struct SEG {
	node tre[N << 3];
	inline void pushdown(int rt) {
		if (!tre[rt].tag) return ;
		int tag = tre[rt].tag;
		tre[ls(rt)].maxn += tag, tre[rs(rt)].maxn += tag;
		tre[ls(rt)].tag += tag, tre[rs(rt)].tag += tag;
		tre[rt].tag = 0;
		return ;
	}
	inline void pushup(int rt) {
		tre[rt].maxn = max(tre[ls(rt)].maxn, tre[rs(rt)].maxn);
		return ;
	}
	void update(int rt, int l, int r, int L, int R, int x) {
		if (L <= l && r <= R) {
			tre[rt].tag += x, tre[rt].maxn += x;
			return ;
		}
		pushdown(rt);
		int mid = (l + r) >> 1;
		if (L <= mid) update(ls(rt), l, mid, L, R, x);
		if (R > mid) update(rs(rt), mid + 1, r, L, R, x);
		pushup(rt);
		return ;
	}
} T;

signed main() {
	read(n), read(m);
	for (int i = 1; i <= n; i++) {
		read(a[i].l), read(a[i].r);
		b[++tot] = a[i].l, b[++tot] = a[i].r;
	}
	sort(a + 1, a + 1 + n);
	sort(b + 1, b + 1 + tot);
	int num = unique(b + 1, b + 1 + tot) - b - 1;
	for (int i = 1; i <= n; i++) {
		int li = lower_bound(b + 1, b + 1 + num, a[i].l) - b;
		int ri = lower_bound(b + 1, b + 1 + num, a[i].r) - b;
		a[i].l = li, a[i].r = ri;
	}
	for (int l = 1, r = 0; l <= n; T.update(1, 1, num, a[l].l, a[l].r, -1), l++) {
		while (r < n && T.tre[1].maxn < m) {
			r++;
			T.update(1, 1, num, a[r].l, a[r].r, 1);
		}
		if (r == n && T.tre[1].maxn < m) break;
		ans = min(ans, b[a[r].r] - b[a[r].l] - b[a[l].r] + b[a[l].l]);
	}
	printf("%lld", (ans == 0x7fffffff ? -1 : ans));
	return 0;
}

2024/7/23 10:37
加载中...