吐槽数据
查看原帖
吐槽数据
397329
To_our_starry_sea楼主2024/8/1 19:10

虽然是 at 上的题,加强不了数据,但还是想吐槽一下。

我在每次确定覆盖的左右区间时,用的是双指针,然而我写成了下面的东西:

for (int i = 1; i <= 2 * n; i++) L[i] = 1, R[i] = 2 * n;
	for (int i = 1; i <= 2 * n; i++) {
		while (L[i] < i && a[i].x - a[L[i]].x >= K) L[i]++;
		if (L[i] < i) change(1, 1, 2 * n, L[i], i - 1, a[i].id);
	}
	for (int i = 2 * n; i >= 1; i--) {
		while (R[i] > i && a[R[i]].x - a[i].x >= K) R[i]--;
		if (R[i] > i) change(1, 1, 2 * n, i + 1, R[i], a[i].id);
	}

不出意料,这玩意 TLE 了

然后我调了半天,发现了傻逼问题我改成了下面的东西:

for (int i = 1; i <= 2 * n; i++) L[i] = 1, R[i] = 2 * n;
	for (int i = 1; i <= 2 * n; i++) {
		L[i] = max(L[i], L[i - 1]);
		while (L[i] < i && a[i].x - a[L[i]].x >= K) L[i]++;
		if (L[i] < i) change(1, 1, 2 * n, L[i], i - 1, a[i].id);
	}
	for (int i = 2 * n; i >= 1; i--) {
		R[i] = max(R[i], R[i + 1]);
		while (R[i] > i && a[R[i]].x - a[i].x >= K) R[i]--;
		if (R[i] > i) change(1, 1, 2 * n, i + 1, R[i], a[i].id);
	}

注意到这个东西在计算右端点时总共还是 O(n2log⁡L)O(n^2\log L) 的,然而就跑过去了,虽然是 5s,还是很离谱的

吐槽一波

2024/8/1 19:10
加载中...