Submission #66700


ソースコード

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<multiset<long long> > dists(1e5);
for(int i = 0; i < n; ++i){
dists[c[i]].insert(vtoi[dist[i]]);
}
for(int i = 0; i < 1e5; ++i){
if(!dists[i].empty()){
BIT.add(*dists[i].begin(), 1);
}
}
for(int i = 0; i < q; ++i){
int x, nc;
cin >> x >> nc;
--x, --nc;
if(!dists[c[x]].empty()){
BIT.add(*dists[c[x]].begin(), -1);
}
if(dists[c[x]].find(vtoi[dist[x]]) != dists[c[x]].end()){
dists[c[x]].erase(dists[c[x]].find(vtoi[dist[x]]));
}
if(!dists[c[x]].empty()){
BIT.add(*dists[c[x]].begin(), 1);
}
c[x] = nc;
if(!dists[c[x]].empty()){
BIT.add(*dists[c[x]].begin(), -1);
}
dists[c[x]].insert(vtoi[dist[x]]);
if(!dists[c[x]].empty()){
BIT.add(*dists[c[x]].begin(), 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-15 07:42:58
言語 C++17
状態 Accepted
得点 5
ソースコード長 3977 Byte
最大実行時間 334 ms
最大メモリ使用量 36616 KB

セット

セット 得点 Cases
1 ALL 5 / 5 *

テストケース

ファイル名 状態 実行時間 メモリ使用量 #
in01.txt AC 156 ms 18388 KB
1
in02.txt AC 68 ms 8492 KB
1
in03.txt AC 104 ms 11116 KB
1
in04.txt AC 134 ms 13912 KB
1
in05.txt AC 78 ms 9736 KB
1
in06.txt AC 290 ms 28244 KB
1
in07.txt AC 263 ms 29200 KB
1
in08.txt AC 267 ms 30400 KB
1
in09.txt AC 266 ms 30576 KB
1
in10.txt AC 274 ms 30844 KB
1
in11.txt AC 153 ms 30372 KB
1
in12.txt AC 156 ms 30668 KB
1
in13.txt AC 80 ms 25968 KB
1
in14.txt AC 117 ms 18804 KB
1
in15.txt AC 88 ms 20980 KB
1
in16.txt AC 175 ms 27668 KB
1
in17.txt AC 305 ms 36108 KB
1
in18.txt AC 334 ms 36616 KB
1
in19.txt AC 302 ms 36356 KB
1
in20.txt AC 74 ms 18464 KB
1
in21.txt AC 130 ms 20112 KB
1
in22.txt AC 85 ms 21148 KB
1
in23.txt AC 72 ms 20632 KB
1
in24.txt AC 63 ms 21152 KB
1
in25.txt AC 69 ms 23468 KB
1
in26.txt AC 74 ms 24288 KB
1
in27.txt AC 42 ms 22956 KB
1
in28.txt AC 37 ms 22952 KB
1
sample01.txt AC 23 ms 23076 KB
1
sample02.txt AC 20 ms 23200 KB
1