結果
問題 |
No.868 ハイパー部分和問題
|
ユーザー |
![]() |
提出日時 | 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 |
ソースコード
#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; }