Submission #77537
ソースコード
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 | #include <bits/stdc++.h> using namespace std; struct Mo { private : int n; vector<pair< int , int > > lr; public : Mo( int n) : n(n) {} /* [l, r) */ void insert( int l, int r){ lr.emplace_back(l, r); } template < typename AL, typename AR, typename EL, typename ER, typename O> void run( const AL &add_left, const AR &add_right, const EL &erase_left, const ER &erase_right, const O &out){ int q = ( int ) lr.size(); int bs = n / min< int >(n, sqrt (q)); vector< int > ord(q); iota(ord.begin(), ord.end(), 0); sort(ord.begin(), ord.end(), [&]( int a, int b){ int ablock = lr[a].first / bs, bblock = lr[b].first / bs; if (ablock != bblock) return (ablock < bblock); if (ablock & 1) return (lr[a].second > lr[b].second); return (lr[a].second < lr[b].second); }); int l = 0, r = 0; for (auto idx : ord){ while (l > lr[idx].first) add_left(--l); while (r < lr[idx].second) add_right(r++); while (l < lr[idx].first) erase_left(l++); while (r > lr[idx].second) erase_right(--r); out(idx); } } template < typename A, typename E, typename O> void run( const A &add, const E &erase, const O &out){ run(add, add, erase, erase, out); } }; template < typename T> struct RSQ { int bs; vector<T> a, b; RSQ( int n) : a(n), bs(max(1, ( int ) sqrt (n))), b((n + bs - 1) / bs) {} RSQ( const vector<T> &a) : a(a), bs(max(1, ( int ) sqrt (a.size()))), b((a.size() + bs - 1) / bs) {} T get( int k) const { return a[k]; } void add( int k, const T &v = 1) { b[k / bs] += v; a[k] += v; } void update( int k, const T &v) { b[k / bs] += v - a[k]; a[k] = v; } T query( int l, int r) { T ret = T(); for ( int i = l; i < min(r, (l + bs) / bs * bs); ++i) { ret += a[i]; } for ( int i = (l + bs) / bs; i < r / bs; ++i) { ret += b[i]; } for ( int i = max((l + bs) / bs, r / bs) * bs; i < r; ++i) { ret += a[i]; } return ret; } T query( int r) { return query(0, r); } }; int main(){ cin.tie(nullptr); ios_base::sync_with_stdio( false ); int n, m; cin >> n >> m; vector< int > a(n), t(m), vs; Mo mo(n); for ( int i = 0; i < n; ++i) { cin >> a[i]; vs.push_back(a[i]); } for ( int i = 0; i < m; ++i) { int l, r; cin >> l >> r >> t[i]; --l, --r; mo.insert(l, r + 1); } sort(vs.begin(), vs.end()); vs.erase(unique(vs.begin(), vs.end()), vs.end()); vector< int > ca(n); for ( int i = 0; i < n; ++i) { ca[i] = lower_bound(vs.begin(), vs.end(), a[i]) - vs.begin(); } RSQ< long long > rsq(vs.size()); RSQ< long long > rcq(vs.size()); vector< long long > res(m); long long sum = 0; int cnt = 0; mo.run([&]( int k) { sum += a[k]; cnt++; rsq.add(ca[k], a[k]); rcq.add(ca[k], 1); }, [&]( int k) { sum -= a[k]; cnt--; rsq.add(ca[k], -a[k]); rcq.add(ca[k], -1); }, [&]( int k) { int lower = lower_bound(vs.begin(), vs.end(), t[k]) - vs.begin(); long long ls = rsq.query(lower); long long lc = rcq.query(lower); res[k] += ( long long ) lc * t[k] - ls + sum - ls - ( long long ) (cnt - lc) * t[k]; }); for ( int i = 0; i < m; ++i) { cout << res[i] << '\n' ; } return (0); } |
ステータス
項目 | データ |
---|---|
問題 | 1730 - Sum of Absolutes |
ユーザー名 | ei1903 |
投稿日時 | 2024-01-19 09:26:51 |
言語 | C++17 |
状態 | Accepted |
得点 | 5 |
ソースコード長 | 3745 Byte |
最大実行時間 | 778 ms |
最大メモリ使用量 | 40024 KB |
セット
セット | 得点 | Cases | |
---|---|---|---|
1 | ALL | 5 / 5 | * |
テストケース
ファイル名 | 状態 | 実行時間 | メモリ使用量 | # |
---|---|---|---|---|
00_sample_00.in | AC | 23 ms | 600 KB |
1
|
01_small_00.in | AC | 32 ms | 680 KB |
1
|
01_small_01.in | AC | 19 ms | 636 KB |
1
|
01_small_02.in | AC | 17 ms | 468 KB |
1
|
02_corner_minimum_00.in | AC | 19 ms | 552 KB |
1
|
02_corner_minimum_01.in | AC | 29 ms | 512 KB |
1
|
02_corner_minimum_02.in | AC | 18 ms | 472 KB |
1
|
03_general_00.in | AC | 20 ms | 428 KB |
1
|
03_general_01.in | AC | 27 ms | 508 KB |
1
|
04_random_00.in | AC | 28 ms | 468 KB |
1
|
04_random_01.in | AC | 21 ms | 544 KB |
1
|
04_random_02.in | AC | 24 ms | 620 KB |
1
|
04_random_03.in | AC | 24 ms | 552 KB |
1
|
05_large_00.in | AC | 15 ms | 596 KB |
1
|
05_large_01.in | AC | 30 ms | 876 KB |
1
|
05_large_02.in | AC | 32 ms | 1196 KB |
1
|
05_large_03.in | AC | 27 ms | 864 KB |
1
|
06_corner_maximum_00.in | AC | 609 ms | 13796 KB |
1
|
06_corner_maximum_01.in | AC | 766 ms | 16724 KB |
1
|
06_corner_maximum_02.in | AC | 778 ms | 19536 KB |
1
|
07_corner_critical_00.in | AC | 284 ms | 22344 KB |
1
|
07_corner_critical_01.in | AC | 99 ms | 22212 KB |
1
|
07_corner_critical_02.in | AC | 586 ms | 27776 KB |
1
|
07_corner_critical_03.in | AC | 324 ms | 30708 KB |
1
|
07_corner_critical_04.in | AC | 317 ms | 32620 KB |
1
|
07_corner_critical_05.in | AC | 685 ms | 35556 KB |
1
|
07_corner_critical_06.in | AC | 770 ms | 37856 KB |
1
|
07_corner_critical_07.in | AC | 759 ms | 40024 KB |
1
|
07_corner_critical_08.in | AC | 75 ms | 36432 KB |
1
|