結果

問題 No.2421 entersys?
ユーザー InTheBloomInTheBloom
提出日時 2024-03-05 16:25:30
言語 C++23
(gcc 12.3.0 + boost 1.83.0)
結果
WA  
実行時間 -
コード長 3,030 bytes
コンパイル時間 2,331 ms
コンパイル使用メモリ 152,708 KB
実行使用メモリ 63,912 KB
最終ジャッジ日時 2024-09-29 18:00:33
合計ジャッジ時間 16,692 ms
ジャッジサーバーID
(参考情報)
judge3 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
6,816 KB
testcase_01 AC 3 ms
6,820 KB
testcase_02 AC 4 ms
6,816 KB
testcase_03 AC 2 ms
6,820 KB
testcase_04 AC 2 ms
6,820 KB
testcase_05 AC 3 ms
6,816 KB
testcase_06 AC 4 ms
6,816 KB
testcase_07 AC 3 ms
6,816 KB
testcase_08 AC 4 ms
6,820 KB
testcase_09 AC 6 ms
6,816 KB
testcase_10 AC 4 ms
6,820 KB
testcase_11 AC 731 ms
49,824 KB
testcase_12 AC 736 ms
49,704 KB
testcase_13 AC 683 ms
49,704 KB
testcase_14 AC 727 ms
49,808 KB
testcase_15 AC 778 ms
49,692 KB
testcase_16 AC 797 ms
52,932 KB
testcase_17 AC 748 ms
53,144 KB
testcase_18 AC 778 ms
52,876 KB
testcase_19 AC 780 ms
52,876 KB
testcase_20 AC 775 ms
52,892 KB
testcase_21 AC 651 ms
48,404 KB
testcase_22 AC 597 ms
46,048 KB
testcase_23 AC 944 ms
63,912 KB
testcase_24 AC 969 ms
63,908 KB
testcase_25 AC 938 ms
63,912 KB
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<string> X(N);
    vector<int> L(N), R(N);

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

        int len = (int) X_inv.size();
        if (X_inv.find(X[i]) == X_inv.end()) X_inv[X[i]] = len;
    }

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

            int len = (int) X_inv.size();
            if (X_inv.find(x[i]) == X_inv.end()) X_inv[x[i]] = len;
        }

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

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

            int len = (int) X_inv.size();
            if (X_inv.find(x[i]) == X_inv.end()) X_inv[x[i]] = len;
        }
    }

    // 座圧
    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(X_inv.size());

    for (int i = 0; i < N; i++) {
        int idx = X_inv[X[i]];
        mp[idx][L[i]] = IN;
        mp[idx][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