Submission #66689
ソースコード
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 157 158 159 160 | #include <bits/extc++.h> using namespace std; template < typename T > struct BinaryIndexedTree { private : vector< T > data; public : BinaryIndexedTree() = default ; explicit BinaryIndexedTree( size_t sz) : data(sz + 1, 0) {} explicit BinaryIndexedTree( const vector< T > &vs) : data(vs.size() + 1, 0) { for ( size_t i = 0; i < vs.size(); i++) data[i + 1] = vs[i]; for ( size_t i = 1; i < data.size(); i++) { size_t j = i + (i & -i); if (j < data.size()) data[j] += data[i]; } } void add( int k, const T &x) { for (++k; k < ( int ) data.size(); k += k & -k) data[k] += x; } T fold( int r) const { T ret = T(); for (; r > 0; r -= r & -r) ret += data[r]; return ret; } T fold( int l, int r) const { return fold(r) - fold(l); } int lower_bound(T x) const { int i = 0; for ( int k = 1 << (__lg(data.size() - 1) + 1); k > 0; k >>= 1) { if (i + k < data.size() && data[i + k] < x) { x -= data[i + k]; i += k; } } return i; } int upper_bound(T x) const { int i = 0; for ( int k = 1 << (__lg(data.size() - 1) + 1); k > 0; k >>= 1) { if (i + k < data.size() && data[i + k] <= x) { x -= data[i + k]; i += k; } } return i; } }; int main(){ cin.tie(nullptr); ios_base::sync_with_stdio( false ); int n, m, q, k; cin >> n >> m >> q >> k; vector< int > c(n); vector<vector<pair< int , int > > > graph(n); for ( int i = 0; i < n; ++i){ cin >> c[i]; --c[i]; } for ( int i = 0; i < m; ++i){ int u, v, l; cin >> u >> v >> l; --u, --v; graph[u].emplace_back(v, l); graph[v].emplace_back(u, l); } vector< long long > dist(n, LLONG_MAX >> 1); priority_queue<pair< long long , int >, vector<pair< long long , int > >, greater<> > pq; dist[0] = 0; pq.emplace(0, 0); while (!pq.empty()){ auto [cur_cost, cur_node] = pq.top(); pq.pop(); if (dist[cur_node] < cur_cost) continue ; for (auto [nxt_node, l] : graph[cur_node]){ if (dist[cur_node] + l < dist[nxt_node]){ dist[nxt_node] = dist[cur_node] + l; pq.emplace(dist[nxt_node], nxt_node); } } } int idx = 0; map< long long , int > vtoi; vector< long long > itov; for ( int i = 0; i < n; ++i){ vtoi[dist[i]]; } for (auto &&[key, value] : vtoi){ value = idx; itov.emplace_back(key); ++idx; } int siz = idx; BinaryIndexedTree< int > BIT(siz); vector<map< long long , int > > cnt(1e5); for ( int i = 0; i < n; ++i){ cnt[c[i]][vtoi[dist[i]]]++; } for ( int i = 0; i < 1e5; ++i){ if (!cnt[i].empty()){ BIT.add(cnt[i].begin()->first, 1); } } for ( int i = 0; i < q; ++i){ int x, nc; cin >> x >> nc; --x, --nc; if (!cnt[c[x]].empty()){ BIT.add(cnt[c[x]].begin()->first, -1); } if (--cnt[c[x]][vtoi[dist[x]]] == 0){ cnt[c[x]].erase(vtoi[dist[x]]); } if (!cnt[c[x]].empty()){ BIT.add(cnt[c[x]].begin()->first, 1); } c[x] = nc; if (!cnt[c[x]].empty()){ BIT.add(cnt[c[x]].begin()->first, -1); } cnt[c[x]][vtoi[dist[x]]]++; if (!cnt[c[x]].empty()){ BIT.add(cnt[c[x]].begin()->first, 1); } if (BIT.fold(siz) < k){ cout << -1 << '\n' ; } else { cout << itov[BIT.lower_bound(k)] << '\n' ; } } return (0); } |
ステータス
項目 | データ |
---|---|
問題 | 1512 - Colorful Graph |
ユーザー名 | ei1903 |
投稿日時 | 2021-05-14 22:43:38 |
言語 | C++17 |
状態 | Accepted |
得点 | 5 |
ソースコード長 | 3930 Byte |
最大実行時間 | 304 ms |
最大メモリ使用量 | 38088 KB |
セット
セット | 得点 | Cases | |
---|---|---|---|
1 | ALL | 5 / 5 | * |
テストケース
ファイル名 | 状態 | 実行時間 | メモリ使用量 | # |
---|---|---|---|---|
in01.txt | AC | 163 ms | 19412 KB |
1
|
in02.txt | AC | 78 ms | 8512 KB |
1
|
in03.txt | AC | 102 ms | 11452 KB |
1
|
in04.txt | AC | 146 ms | 14764 KB |
1
|
in05.txt | AC | 83 ms | 9772 KB |
1
|
in06.txt | AC | 274 ms | 29616 KB |
1
|
in07.txt | AC | 279 ms | 30672 KB |
1
|
in08.txt | AC | 298 ms | 31844 KB |
1
|
in09.txt | AC | 282 ms | 32252 KB |
1
|
in10.txt | AC | 273 ms | 32488 KB |
1
|
in11.txt | AC | 153 ms | 31864 KB |
1
|
in12.txt | AC | 151 ms | 32384 KB |
1
|
in13.txt | AC | 82 ms | 27532 KB |
1
|
in14.txt | AC | 134 ms | 19060 KB |
1
|
in15.txt | AC | 73 ms | 21748 KB |
1
|
in16.txt | AC | 107 ms | 29320 KB |
1
|
in17.txt | AC | 266 ms | 37736 KB |
1
|
in18.txt | AC | 304 ms | 38088 KB |
1
|
in19.txt | AC | 282 ms | 37936 KB |
1
|
in20.txt | AC | 71 ms | 18484 KB |
1
|
in21.txt | AC | 75 ms | 20132 KB |
1
|
in22.txt | AC | 81 ms | 21160 KB |
1
|
in23.txt | AC | 64 ms | 20648 KB |
1
|
in24.txt | AC | 63 ms | 21040 KB |
1
|
in25.txt | AC | 72 ms | 23476 KB |
1
|
in26.txt | AC | 68 ms | 24164 KB |
1
|
in27.txt | AC | 47 ms | 22832 KB |
1
|
in28.txt | AC | 44 ms | 23084 KB |
1
|
sample01.txt | AC | 20 ms | 23076 KB |
1
|
sample02.txt | AC | 19 ms | 23068 KB |
1
|