結果

問題 No.1718 Random Squirrel
ユーザー SSRS
提出日時 2021-10-22 22:09:58
言語 C++14
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 319 ms / 2,000 ms
コード長 3,019 bytes
コンパイル時間 2,183 ms
コンパイル使用メモリ 190,276 KB
実行使用メモリ 22,744 KB
最終ジャッジ日時 2024-09-23 05:42:27
合計ジャッジ時間 8,100 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 31
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#include <bits/stdc++.h>
using namespace std;
struct heavy_light_decomposition{
vector<int> p, d, sz, in, next;
void dfs1(vector<vector<int>> &c, int v = 0){
sz[v] = 1;
for (int &w : c[v]){
d[w] = d[v] + 1;
dfs1(c, w);
sz[v] += sz[w];
if (sz[w] > sz[c[v][0]]){
swap(w, c[v][0]);
}
}
}
void dfs2(vector<vector<int>> &c, int &t, int v = 0){
in[v] = t;
t++;
for (int w : c[v]){
if (w == c[v][0]){
next[w] = next[v];
} else {
next[w] = w;
}
dfs2(c, t ,w);
}
}
heavy_light_decomposition(vector<int> &p, vector<vector<int>> &c): p(p){
int N = p.size();
sz = vector<int>(N, 0);
d = vector<int>(N, 0);
dfs1(c);
in = vector<int>(N, 0);
next = vector<int>(N, 0);
int t = 0;
dfs2(c, t);
}
int lca(int u, int v){
while (true){
if (in[u] > in[v]){
swap(u, v);
}
if (next[u] == next[v]){
return u;
}
v = p[next[v]];
}
}
int dist(int u, int v){
return d[u] + d[v] - d[lca(u, v)] * 2;
}
};
int main(){
int N, K;
cin >> N >> K;
vector<vector<int>> E(N);
for (int i = 0; i < N - 1; i++){
int u, v;
cin >> u >> v;
u--;
v--;
E[u].push_back(v);
E[v].push_back(u);
}
vector<int> D(K);
for (int i = 0; i < K; i++){
cin >> D[i];
D[i]--;
}
vector<int> p(N, -1);
vector<vector<int>> c(N);
queue<int> Q;
Q.push(0);
vector<int> bfs;
while (!Q.empty()){
int v = Q.front();
Q.pop();
bfs.push_back(v);
for (int w : E[v]){
if (w != p[v]){
p[w] = v;
c[v].push_back(w);
Q.push(w);
}
}
}
heavy_light_decomposition T(p, c);
vector<pair<int, int>> P(K);
for (int i = 0; i < K; i++){
P[i] = make_pair(T.in[D[i]], D[i]);
}
sort(P.begin(), P.end());
int S = 0;
vector<int> imos(N, 0);
for (int i = 0; i < K; i++){
int u = P[i].second;
int v = P[(i + 1) % K].second;
S += T.dist(u, v);
imos[u]++;
imos[v]++;
int w = T.lca(u, v);
imos[w]--;
if (w > 0){
imos[p[w]]--;
}
}
reverse(bfs.begin(), bfs.end());
for (int v : bfs){
if (v != 0){
imos[p[v]] += imos[v];
}
}
vector<int> d1(K);
for (int i = 0; i < K; i++){
d1[i] = T.dist(D[0], D[i]);
}
int s = max_element(d1.begin(), d1.end()) - d1.begin();
vector<int> d2(K);
for (int i = 0; i < K; i++){
d2[i] = T.dist(D[s], D[i]);
}
int t = max_element(d2.begin(), d2.end()) - d2.begin();
vector<int> ans(N, -1);
for (int i = 0; i < N; i++){
if (imos[i] > 0){
ans[i] = S - max(T.dist(D[s], i), T.dist(D[t], i));
}
}
queue<int> Q2;
for (int i = 0; i < N; i++){
if (imos[i] > 0){
Q2.push(i);
}
}
while (!Q2.empty()){
int v = Q2.front();
Q2.pop();
for (int w : E[v]){
if (ans[w] == -1){
ans[w] = ans[v] + 1;
Q2.push(w);
}
}
}
for (int i = 0; i < N; i++){
cout << ans[i] << endl;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0