求助,WA 35pts
查看原帖
求助,WA 35pts
174009
denominator楼主2024/10/4 20:42

WA on #3, #11, #20,但是这三个点的数据是相同的!

码风比较奇怪。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 40010;
int T, n, m;
ll h, d;
struct obstacle {
	ll x, y1, y2;
} o[N];
namespace check_in_bs {
	int c, cnt, b[N << 2];
	ll a[N << 2], l[N << 1], r[N << 1], dp[N << 1];
	bool check (int n) {
		while (o[n + 1].x == o[n].x) {
			n++;
		}
		c = cnt = 0;
		ll f = 0x7f7f7f7f7f7f7f7fll;
		for (int i = 1; i <= n; i++) {
			ll x = o[i].x, y1 = o[i].y1, y2 = o[i].y2;
			if (y1 == 0 && y2 >= h) {
				return true;
			} else if (y1 > h) {
				continue;
			} else if (y2 < h) {
				l[++c] = x - (d * 2 - d / h * y1), r[c] = x - (d * 2 - d / h * y2);
				l[++c] = x - d / h * y2, r[c] = x - d / h * y1;
				if (y1 == 0) {
					f = x;
				}
			} else {
				l[++c] = x - (d * 2 - d / h * y1), r[c] = x - d / h * y1;
			}
		}
		for (int i = 1; i <= c; i++) {
			a[++cnt] = l[i], a[++cnt] = r[i] + 1;
		}
		sort (a + 1, a + cnt + 1);
		cnt = unique (a + 1, a + cnt + 1) - a - 1;
		for (int i = 1; i <= cnt; i++) {
			b[i] = 0;
		}
		for (int i = 1; i <= c; i++) {
			l[i] = lower_bound (a + 1, a + cnt + 1, l[i]) - a;
			r[i] = lower_bound (a + 1, a + cnt + 1, r[i] + 1) - a;
			b[l[i]]++, b[r[i]]--;
		}
		l[c = 1] = -0x7f7f7f7f7f7f7f7fll;
		for (int i = 1; i <= cnt; i++) {
			b[i] += b[i - 1];
			if (b[i] == 0 && b[i - 1] != 0) {
				l[c] = a[i] - 1;
			} else if (b[i] != 0 && b[i - 1] == 0) {
				r[c++] = a[i];
			}
		}
		dp[c] = r[c] = 0x7f7f7f7f7f7f7f7fll;
		for (int i = c - 1; i >= 1; i--) {
			dp[i] = -0x7f7f7f7f7f7f7f7fll;
			ll ls = l[i] + d * 2, rs = r[i] + d * 2;
			int jl = upper_bound (r + 1, r + c + 1, ls) - r, jr = lower_bound (l + 1, l + c + 1, rs) - l - 1;
			for (int j = min (jl, c); j <= min (jr, c); j++) {
				if (!(ls <= r[j] || l[j] <= rs)) {
					continue;
				}
				if (j == c) {
					dp[i] = max (dp[i], r[i]);
				} else if (l[i] + d * 2 < dp[j]) {
					dp[i] = max (dp[i], min (r[i], dp[j] - d * 2));
				}
			}
		}
		for (int i = 1; i <= c; i++) {
			if (r[i] > 0) {
				return dp[i] <= 0 || l[i] >= f;
			}
		}
		return false;
	}
}
int main () {
	scanf ("%d", &T);
	while (T --> 0) {
		scanf ("%lld%lld%d%d", &d, &h, &n, &m);
		h *= 2;
		d *= h;
		for (int i = 1; i <= n; i++) {
			scanf ("%lld%lld%lld", &o[i].x, &o[i].y2, &o[i].y1);
			o[i].x *= h;
			o[i].y1 *= 2, o[i].y2 *= 2;
		}
		for (int i = 1; i <= m; i++) {
			scanf ("%lld%lld", &o[n + i].x, &o[n + i].y2);
			o[n + i].x *= h;
			o[n + i].y1 = 0, o[n + i].y2 *= 2;
		}
		sort (o + 1, o + n + m + 1, [] (obstacle x, obstacle y) { return x.x < y.x; });
		int l = 1, r = n + m, ans = -1;
		while (l <= r) {
			int mid = (l + r) >> 1;
			if (check_in_bs::check (mid)) {
				r = mid - 1;
				ans = mid;
			} else {
				l = mid + 1;
			}
		}
		if (ans == -1) {
			puts ("Dino!");
		} else {
			ll ans1 = o[ans].x / h;
			assert (ans1 / 10 % 10 != 1);
			printf ("%lld\n", ans1);
		}
	}
	return 0;
}
2024/10/4 20:42
加载中...