結果

問題 No.2421 entersys?
ユーザー InTheBloomInTheBloom
提出日時 2024-03-05 15:51:11
言語 C++23
(gcc 12.3.0 + boost 1.83.0)
結果
WA  
実行時間 -
コード長 2,671 bytes
コンパイル時間 1,942 ms
コンパイル使用メモリ 153,808 KB
実行使用メモリ 62,308 KB
最終ジャッジ日時 2024-03-05 15:51:31
合計ジャッジ時間 17,805 ms
ジャッジサーバーID
(参考情報)
judge13 / judge15
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
6,676 KB
testcase_01 WA -
testcase_02 WA -
testcase_03 WA -
testcase_04 WA -
testcase_05 WA -
testcase_06 WA -
testcase_07 WA -
testcase_08 WA -
testcase_09 WA -
testcase_10 WA -
testcase_11 WA -
testcase_12 WA -
testcase_13 WA -
testcase_14 WA -
testcase_15 WA -
testcase_16 WA -
testcase_17 WA -
testcase_18 WA -
testcase_19 WA -
testcase_20 WA -
testcase_21 WA -
testcase_22 AC 540 ms
45,704 KB
testcase_23 WA -
testcase_24 WA -
testcase_25 WA -
testcase_26 WA -
testcase_27 WA -
testcase_28 WA -
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <string>
#include <map>
#include <algorithm>

#include <atcoder/segtree>

using namespace std;
using namespace atcoder;

int op (int x, int y) { return x + y; }
int e () { return 0; }

int main () {
    // クエリ2 -> 座圧 + 区間加算、1点取得のセグ木。
    // クエリ1と3 -> 人ごとにmapを持っておいて、lower_boundしましょう。
    int N; cin >> N;
    map<string, int> X_inv;
    vector<int> L(N), R(N);

    for (int i = 0; i < N; i++) {
        string X;
        cin >> X >> L[i] >> R[i];
        X_inv[X] = i;
    }

    int Q; cin >> Q;
    vector<int> type(Q), l(Q), r(Q), t(Q);
    vector<string> x(Q);

    for (int i = 0; i < Q; i++) {
        cin >> type[i];
        if (type[i] == 1) {
            cin >> x[i] >> t[i];
        }

        if (type[i] == 2) {
            cin >> t[i];
        }

        if (type[i] == 3) {
            cin >> x[i] >> l[i] >> r[i];
        }
    }

    // 座圧
    vector<int> f_inv;
    for (int i = 0; i < N; i++) {
        f_inv.push_back(L[i]);
        f_inv.push_back(R[i]);
    }
    for (int i = 0; i < Q; i++) {
        if (0 < l[i]) f_inv.push_back(l[i]);
        if (0 < r[i]) f_inv.push_back(r[i]);
        if (0 < t[i]) f_inv.push_back(t[i]);
    }

    sort(f_inv.begin(), f_inv.end());
    f_inv.erase(unique(f_inv.begin(), f_inv.end()), f_inv.end());

    map<int, int> f;
    for (int i = 0; i < f_inv.size(); i++) f[f_inv[i]] = i;

    // セグ木
    segtree<int, op, e> seg(f.size() + 10);

    auto range_add = [&](int l, int r, int v) -> void {
        seg.set(l, seg.get(l) + v);
        seg.set(r, seg.get(r) - v);
    };

    auto point_get = [&](int x) -> int {
        return seg.prod(0, x+1);
    };

    for (int i = 0; i < N; i++) {
        range_add(f[L[i]], f[R[i]] + 1, 1);
    }

    // map
    enum STATE {
        IN,
        OUT,
    };

    vector<map<int, STATE, greater<int>>> mp(N);

    for (int i = 0; i < N; i++) {
        mp[i][L[i]] = IN;
        mp[i][R[i] + 1] = OUT;
    }

    // クエリ処理
    for (int i = 0; i < Q; i++) {
        if (type[i] == 1) {
            int idx = X_inv[x[i]];
            auto it = mp[idx].lower_bound(t[i]);

            if (it == mp[idx].end() || it->second == OUT) {
                cout << "No\n";
            }
            else {
                cout << "Yes\n";
            }
        }

        if (type[i] == 2) {
            cout << point_get(f[t[i]]) << "\n";
        }

        if (type[i] == 3) {
            int idx = X_inv[x[i]];
            mp[idx][l[i]] = IN;
            mp[idx][r[i] + 1] = OUT;

            range_add(f[l[i]], f[r[i]] + 1, 1);
        }
    }
}
0