結果

問題 No.868 ハイパー部分和問題
ユーザー lam6er
提出日時 2025-04-15 22:15:17
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
WA  
実行時間 -
コード長 1,992 bytes
コンパイル時間 4,213 ms
コンパイル使用メモリ 200,520 KB
実行使用メモリ 63,608 KB
最終ジャッジ日時 2025-04-15 22:18:40
合計ジャッジ時間 78,865 ms
ジャッジサーバーID
(参考情報)
judge2 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 12 WA * 26
権限があれば一括ダウンロードができます

ソースコード

diff #

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

const int MAX_K = 15001;

class SegmentTree {
    int n;
    vector<bitset<MAX_K>> tree;
    int K;

    bitset<MAX_K> merge(const bitset<MAX_K>& left, const bitset<MAX_K>& right) {
        bitset<MAX_K> res = left | right;
        for (int i = 0; i <= K; ++i) {
            if (left[i]) {
                res |= right << i;
            }
        }
        res &= bitset<MAX_K>((1LL << (K + 1)) - 1); // Ensure we don't exceed K
        return res;
    }

public:
    SegmentTree(const vector<int>& data, int K) : K(K) {
        int size = data.size();
        n = 1;
        while (n < size) n <<= 1;
        tree.resize(2 * n, bitset<MAX_K>(1)); // Initialize with 0

        for (int i = 0; i < size; ++i) {
            int val = data[i];
            bitset<MAX_K> bs;
            bs.set(0);
            if (val > 0 && val <= K) {
                bs.set(val);
            }
            tree[n + i] = bs;
        }
        for (int i = size; i < n; ++i) {
            tree[n + i].set(0);
        }

        for (int i = n - 1; i >= 1; --i) {
            tree[i] = merge(tree[2 * i], tree[2 * i + 1]);
        }
    }

    void update(int pos, int new_val) {
        pos += n;
        bitset<MAX_K> bs;
        bs.set(0);
        if (new_val > 0 && new_val <= K) {
            bs.set(new_val);
        }
        tree[pos] = bs;
        for (pos >>= 1; pos >= 1; pos >>= 1) {
            tree[pos] = merge(tree[2 * pos], tree[2 * 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 i = 0; i < N; ++i) {
        cin >> A[i];
    }

    SegmentTree st(A, K);

    int Q;
    cin >> Q;
    while (Q--) {
        int x, v;
        cin >> x >> v;
        --x; // Convert to 0-based index
        st.update(x, v);
        cout << (st.query() ? 1 : 0) << '\n';
    }

    return 0;
}
0