結果
| 問題 |
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 |
ソースコード
#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;
}
lam6er