Submission #68558
ソースコード
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 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 | #include <iostream> #include <vector> using namespace std; template < typename Monoid, typename F > struct SegmentTree { int sz; vector< Monoid > seg; const F f; const Monoid M1; SegmentTree( int n, const F f, const Monoid &M1) : f(f), M1(M1) { sz = 1; while (sz < n) sz <<= 1; seg.assign(2 * sz, M1); } void set( int k, const Monoid &x) { seg[k + sz] = x; } void build() { for ( int k = sz - 1; k > 0; k--) { seg[k] = f(seg[2 * k + 0], seg[2 * k + 1]); } } void update( int k, const Monoid &x) { k += sz; seg[k] = x; while (k >>= 1) { seg[k] = f(seg[2 * k + 0], seg[2 * k + 1]); } } Monoid query( int a, int b) { Monoid L = M1, R = M1; for (a += sz, b += sz; a < b; a >>= 1, b >>= 1) { if (a & 1) L = f(L, seg[a++]); if (b & 1) R = f(seg[--b], R); } return f(L, R); } Monoid operator[]( const int &k) const { return seg[k + sz]; } template < typename C > int find_subtree( int a, const C &check, Monoid &M, bool type) { while (a < sz) { Monoid nxt = type ? f(seg[2 * a + type], M) : f(M, seg[2 * a + type]); if (check(nxt)) a = 2 * a + type; else M = nxt, a = 2 * a + 1 - type; } return a - sz; } template < typename C > int find_first( int a, const C &check) { Monoid L = M1; if (a <= 0) { if (check(f(L, seg[1]))) return find_subtree(1, check, L, false ); return -1; } int b = sz; for (a += sz, b += sz; a < b; a >>= 1, b >>= 1) { if (a & 1) { Monoid nxt = f(L, seg[a]); if (check(nxt)) return find_subtree(a, check, L, false ); L = nxt; ++a; } } return -1; } template < typename C > int find_last( int b, const C &check) { Monoid R = M1; if (b >= sz) { if (check(f(seg[1], R))) return find_subtree(1, check, R, true ); return -1; } int a = sz; for (b += sz; a < b; a >>= 1, b >>= 1) { if (b & 1) { Monoid nxt = f(seg[--b], R); if (check(nxt)) return find_subtree(b, check, R, true ); R = nxt; } } return -1; } }; template < typename Monoid, typename F > SegmentTree< Monoid, F > get_segment_tree( int N, const F& f, const Monoid& M1) { return {N, f, M1}; } struct Data { long long left; long long right; bool increasing; Data() : left(INT64_MAX), right(INT64_MIN), increasing( true ) {} Data( long long val) : left(val), right(val), increasing( true ) {} Data( long long left, long long right, bool increasing) : left(left), right(right), increasing(increasing) {} }; int main(){ cin.tie(nullptr); ios_base::sync_with_stdio( false ); int n, q; cin >> n >> q; vector< long long > a(n); for ( int i = 0; i < n; ++i){ cin >> a[i]; } auto f = [](Data a, Data b) -> Data { long long left = a.left; long long right = b.right; bool increasing = a.increasing && b.increasing && a.right <= b.left; return (Data(left, right, increasing)); }; auto seg = get_segment_tree(n, f, Data()); for ( int i = 0; i < n; ++i) seg.set(i, Data(a[i])); seg.build(); int res = 0; for ( int i = 0; i < q; ++i){ int x, v; cin >> x >> v; --x; a[x] += v; seg.update(x, Data(a[x])); if (seg.query(0, n).increasing) { ++res; } } cout << res << '\n' ; return (0); } |
ステータス
項目 | データ |
---|---|
問題 | 1530 - Increasing Sequence 2 |
ユーザー名 | ei1903 |
投稿日時 | 2021-09-23 11:07:20 |
言語 | C++17 |
状態 | Accepted |
得点 | 3 |
ソースコード長 | 3921 Byte |
最大実行時間 | 183 ms |
最大メモリ使用量 | 27672 KB |
セット
セット | 得点 | Cases | |
---|---|---|---|
1 | ALL | 3 / 3 | * |
テストケース
ファイル名 | 状態 | 実行時間 | メモリ使用量 | # |
---|---|---|---|---|
in01.txt | AC | 31 ms | 600 KB |
1
|
in02.txt | AC | 17 ms | 428 KB |
1
|
in03.txt | AC | 23 ms | 508 KB |
1
|
in04.txt | AC | 30 ms | 460 KB |
1
|
in05.txt | AC | 23 ms | 540 KB |
1
|
in06.txt | AC | 26 ms | 876 KB |
1
|
in07.txt | AC | 22 ms | 744 KB |
1
|
in08.txt | AC | 15 ms | 604 KB |
1
|
in09.txt | AC | 21 ms | 756 KB |
1
|
in10.txt | AC | 22 ms | 852 KB |
1
|
in11.txt | AC | 32 ms | 7624 KB |
1
|
in12.txt | AC | 94 ms | 14728 KB |
1
|
in13.txt | AC | 30 ms | 7692 KB |
1
|
in14.txt | AC | 55 ms | 14708 KB |
1
|
in15.txt | AC | 147 ms | 27292 KB |
1
|
in16.txt | AC | 168 ms | 27400 KB |
1
|
in17.txt | AC | 161 ms | 27560 KB |
1
|
in18.txt | AC | 158 ms | 27472 KB |
1
|
in19.txt | AC | 157 ms | 27508 KB |
1
|
in20.txt | AC | 158 ms | 27672 KB |
1
|
in21.txt | AC | 144 ms | 27580 KB |
1
|
in22.txt | AC | 154 ms | 27612 KB |
1
|
in23.txt | AC | 146 ms | 27520 KB |
1
|
in24.txt | AC | 122 ms | 27560 KB |
1
|
in25.txt | AC | 127 ms | 27596 KB |
1
|
in26.txt | AC | 134 ms | 27376 KB |
1
|
in27.txt | AC | 165 ms | 27668 KB |
1
|
in28.txt | AC | 55 ms | 688 KB |
1
|
in29.txt | AC | 183 ms | 27648 KB |
1
|
in30.txt | AC | 160 ms | 27552 KB |
1
|
in31.txt | AC | 149 ms | 27588 KB |
1
|
in32.txt | AC | 155 ms | 27492 KB |
1
|
in33.txt | AC | 158 ms | 27532 KB |
1
|
in34.txt | AC | 150 ms | 27572 KB |
1
|
in35.txt | AC | 95 ms | 2392 KB |
1
|
in36.txt | AC | 153 ms | 27500 KB |
1
|
sample.txt | AC | 21 ms | 620 KB |
1
|