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;
}