結果
問題 | No.833 かっこいい電車 |
ユーザー |
![]() |
提出日時 | 2019-07-29 22:25:27 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,986 bytes |
コンパイル時間 | 747 ms |
コンパイル使用メモリ | 80,216 KB |
実行使用メモリ | 7,424 KB |
最終ジャッジ日時 | 2024-07-02 15:29:10 |
合計ジャッジ時間 | 5,665 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 WA * 1 |
other | AC * 4 WA * 26 |
ソースコード
#include <iostream>#include <vector>#include <algorithm>#include <functional>#include <climits>using namespace std;template<typename Monoid>struct SegmentTree {using OP = function<Monoid(Monoid, Monoid)>;vector<Monoid> tree;int size;const OP f; // bin' operationconst Monoid e; // neutral elementSegmentTree(int nmemb, const Monoid &e, const OP &f):f(f),e(e){size = 1;while (size < nmemb) {size *= 2;}tree.assign(2 * size - 1, e);}void update(int k, Monoid dat){k += size - 1;tree[k] = dat;while(k > 0) {k = (k - 1) / 2;tree[k] = f(tree[2 * k + 1], tree[2 * k + 2]);}}// [l, r)Monoid query(int l, int r){l += size - 1;r += size - 1;Monoid d = e;while (l < r) {if (l % 2 == 0) {d = f(d, tree[l]);l++;}if (r % 2 == 0) {r--;d = f(d, tree[r]);}l = (l - 1) / 2;r = (r - 1) / 2;}return d;}Monoid operator[] (const int k){return query(k, k + 1);}};// 車両がつながってる区間を考える// セグ木で、二分探索 区間の長さと総和は合う?int main(){using ll = long long;ll n, q;ll a;ll com, x;cin >> n >> q;SegmentTree<ll> connect(n + 1, 0, [](ll l, ll r){return l + r;});SegmentTree<ll> sum_a(n + 1, 0, [](ll l, ll r){return l + r;});for (int i = 0; i < n; i++) {cin >> a;sum_a.update(i, a);}while(q--) {cin >> com >> x;--x;if (com == 1) {connect.update(x, 1);}else if (com == 2) {connect.update(x, 0);}else if (com == 3) {sum_a.update(x, sum_a[x] + 1);}else if (com == 4) {ll valid, invalid, mid;ll l, r;// rightvalid = x;invalid = n + 1;while(invalid - valid > 1) {mid = (invalid + valid) / 2;if (connect.query(x, mid) >= mid - x) {valid = mid;}else {invalid = mid;}}r = valid + 1;// leftvalid = x;invalid = -1;while (valid - invalid > 1) {mid = (invalid + valid) / 2;if (connect.query(mid, x + 1) >= x - mid + 1) {valid = mid;}else {invalid = mid;}}l = valid;cout << sum_a.query(l, r) << endl;}}}