求助 ABC d
  • 板块灌水区
  • 楼主PikachuQAQ
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/2/1 21:48
  • 上次更新2025/2/2 12:45:20
查看原帖
求助 ABC d
785796
PikachuQAQ楼主2025/2/1 21:48

WA 了 19 个点

思路就是预处理,将方块分层,第 ii 层由每一列的从下往上第 ii 个方块组成,每一层被消除的时间就是这一层最高方块的 yy 坐标。处理完答案之后 O(1)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;
}
2025/2/1 21:48
加载中...