結果

問題 No.868 ハイパー部分和問題
ユーザー lam6er
提出日時 2025-03-31 17:21:08
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
TLE  
実行時間 -
コード長 1,800 bytes
コンパイル時間 2,667 ms
コンパイル使用メモリ 201,092 KB
実行使用メモリ 70,732 KB
最終ジャッジ日時 2025-03-31 17:22:28
合計ジャッジ時間 11,592 ms
ジャッジサーバーID
(参考情報)
judge1 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample -- * 2
other AC * 14 TLE * 1 -- * 23
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;

const int MAXK = 15000;
using BS = bitset<MAXK + 1>;

struct SegmentTree {
    int n, K;
    vector<BS> tree;
    int size;

    SegmentTree(int _n, int _K, const vector<int>& A) : n(_n), K(_K) {
        size = 1;
        while (size < n) size <<= 1;
        tree.resize(2 * size, BS());
        for (int i = 0; i < n; ++i) {
            int pos = size + i;
            if (A[i] <= K) {
                tree[pos].set(0);
                tree[pos].set(A[i]);
            } else {
                tree[pos].set(0);
            }
        }
        for (int i = size - 1; i > 0; --i) {
            tree[i] = merge(tree[2 * i], tree[2 * i + 1]);
        }
    }

    BS merge(const BS& l, const BS& r) {
        BS res = l | r;
        for (int t = r._Find_first(); t <= K; t = r._Find_next(t)) {
            if (t > K) break;
            res |= (l << t) & mask();
        }
        return res & mask();
    }

    BS mask() const {
        BS m;
        for (int i = 0; i <= K; ++i) m.set(i);
        return m;
    }

    void update(int x, int v) {
        int pos = size + x;
        tree[pos].reset();
        tree[pos].set(0);
        if (v <= K) {
            tree[pos].set(v);
        }
        pos >>= 1;
        while (pos >= 1) {
            tree[pos] = merge(tree[2 * pos], tree[2 * pos + 1]);
            pos >>= 1;
        }
    }

    bool query() {
        return tree[1][K];
    }
};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int N, K;
    cin >> N >> K;
    vector<int> A(N);
    for (int& a : A) cin >> a;

    SegmentTree st(N, K, A);

    int Q;
    cin >> Q;
    while (Q--) {
        int x, v;
        cin >> x >> v;
        st.update(x - 1, v);
        cout << st.query() << '\n';
    }

    return 0;
}
0