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