WA 了 19 个点
思路就是预处理,将方块分层,第 i 层由每一列的从下往上第 i 个方块组成,每一层被消除的时间就是这一层最高方块的 y 坐标。处理完答案之后 O(1) 回答询问即可。
#include <bits/stdc++.h>
using namespace std;
using PII = pair<int, int>;
const int kN = 2e5 + 7;
int n, w, q, cnt[kN], ans[kN];
PII a[kN], b[kN];
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n >> w;
for (int i = 1, x, y; i <= n; i++) {
cin >> x >> y, a[i] = {x, y};
b[i] = {++cnt[x], i}, ans[i] = 2e9;
}
sort(b + 1, b + n + 1);
for (int i = 1, j, mx = 0; i <= n; mx = 0, i = j) {
if (n - i + 1 < w) break;
for (j = i; j <= i + w - 1; j++) mx = max(mx, a[b[j].second].second);
for (int k = i; k < j; k++) ans[b[k].second] = mx;
}
cin >> q;
for (int i = 1, t, x; i <= q; i++) {
cin >> t >> x;
cout << (t >= ans[x] ? "No" : "Yes") << '\n';
}
return 0;
}