Submission #52062
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | #include <iostream> #include <vector> #include <algorithm> #include <functional> #include <string> #include <climits> using namespace std; // end 63 template < typename Monoid> struct SegmentTree { using OP = function<Monoid(Monoid, Monoid)>; vector<Monoid> tree; int size; const OP f; // bin' operation const Monoid e; // neutral element SegmentTree( 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, m; ll x, y; string com; cin >> n >> m; SegmentTree<ll> maxQ(n, -1 * (1ll << 60ll), [](ll l, ll r){ return max(l, r);}); SegmentTree<ll> minQ(n, 1ll << 60ll, [](ll l, ll r){ return min(l, r);}); SegmentTree<ll> sumQ(n, 0, [](ll l, ll r){ return l + r; }); //initialize for ( int i = 0; i < n; i++) { maxQ.update(i, 0); minQ.update(i, 0); sumQ.update(i, 0); } while (m--) { cin >> com; cin >> x >> y; if (com == "getSum" ) { cout << sumQ.query(x, y) << endl; } else if (com == "getMax" ) { cout << maxQ.query(x, y) << endl; } else if (com == "getMin" ) { cout << minQ.query(x, y) << endl; } else if (com == "update" ) { maxQ.update(x, y); minQ.update(x, y); sumQ.update(x, y); } else if (com == "add" ) { maxQ.update(x, maxQ[x] + y); minQ.update(x, minQ[x] + y); sumQ.update(x, sumQ[x] + y); } } return 0; } |
ステータス
項目 | データ |
---|---|
問題 | 1072 - セグメントツリー技術基礎 |
ユーザー名 | ei1710 |
投稿日時 | 2019-07-29 12:05:40 |
言語 | C++14 |
状態 | Accepted |
得点 | 1 |
ソースコード長 | 2705 Byte |
最大実行時間 | 222 ms |
最大メモリ使用量 | 39012 KB |
セット
セット | 得点 | Cases | |
---|---|---|---|
1 | ALL | 1 / 1 | * |
テストケース
ファイル名 | 状態 | 実行時間 | メモリ使用量 | # |
---|---|---|---|---|
in01 | AC | 35 ms | 476 KB |
1
|
in02 | AC | 172 ms | 1984 KB |
1
|
in03 | AC | 148 ms | 8808 KB |
1
|
in04 | AC | 208 ms | 10048 KB |
1
|
in05 | AC | 65 ms | 10260 KB |
1
|
in06 | AC | 83 ms | 7792 KB |
1
|
in07 | AC | 108 ms | 8644 KB |
1
|
in08 | AC | 197 ms | 8608 KB |
1
|
in09 | AC | 186 ms | 14588 KB |
1
|
in10 | AC | 189 ms | 13140 KB |
1
|
in11 | AC | 63 ms | 11944 KB |
1
|
in12 | AC | 100 ms | 11136 KB |
1
|
in13 | AC | 201 ms | 18464 KB |
1
|
in14 | AC | 221 ms | 15740 KB |
1
|
in15 | AC | 132 ms | 21208 KB |
1
|
in16 | AC | 164 ms | 17196 KB |
1
|
in17 | AC | 163 ms | 23688 KB |
1
|
in18 | AC | 89 ms | 24288 KB |
1
|
in19 | AC | 163 ms | 25532 KB |
1
|
in20 | AC | 107 ms | 26136 KB |
1
|
in21 | AC | 122 ms | 23916 KB |
1
|
in22 | AC | 210 ms | 25540 KB |
1
|
in23 | AC | 158 ms | 29844 KB |
1
|
in24 | AC | 159 ms | 27884 KB |
1
|
in25 | AC | 180 ms | 27712 KB |
1
|
in26 | AC | 218 ms | 33820 KB |
1
|
in27 | AC | 186 ms | 35308 KB |
1
|
in28 | AC | 222 ms | 34112 KB |
1
|
in29 | AC | 97 ms | 37520 KB |
1
|
in30 | AC | 206 ms | 39012 KB |
1
|
in31 | AC | 121 ms | 36792 KB |
1
|
in32 | AC | 155 ms | 38288 KB |
1
|