結果
| 問題 |
No.868 ハイパー部分和問題
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 2025-04-15 22:21:43 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,992 bytes |
| コンパイル時間 | 2,020 ms |
| コンパイル使用メモリ | 200,588 KB |
| 実行使用メモリ | 63,480 KB |
| 最終ジャッジ日時 | 2025-04-15 22:24:53 |
| 合計ジャッジ時間 | 76,483 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / 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;
}
lam6er