이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
const int N = 500005;
int n, k;
vector<int> states[N];
vector<int> adj[N];
int tin[N], tout[N], tid;
int up[N][20], dif[N];
int cnt[N], ans, huh[N];
void dfs1(int v, int p){
up[v][0] = p;
for(int i = 1; i<20; ++i)
up[v][i] = up[up[v][i-1]][i-1];
tin[v] = ++tid;
for(auto u : adj[v])
if(u!=p) dfs1(u, v);
tout[v] = tid;
}
bool is_fa(int u, int v){
return tin[u]<=tin[v] && tout[v]<=tout[u];
}
int lca(int u, int v){
if(is_fa(u, v)) return u;
if(is_fa(v, u)) return v;
for(int i = 19; i>=0; --i)
if(!is_fa(up[u][i], v))
u = up[u][i];
return up[u][0];
}
int dfs2(int v, int p){
int sum = dif[v];
for(auto u : adj[v]){
if(u==p) continue;
sum += dfs2(u, v);
cnt[v] += cnt[u];
}
huh[v] = sum;
if(v==0) return sum;
cnt[v] += (sum==0);
if(sum==0 && cnt[v]==1)
++ans;
return sum;
}
int main(){
// freopen("a.in", "r", stdin);
cin.tie(0)->sync_with_stdio(0);
cin >> n >> k;
for(int i = 0; i<n-1; ++i){
int u, v; cin >> u >> v;
--u; --v;
adj[u].push_back(v);
adj[v].push_back(u);
}
for(int i = 0; i<n; ++i){
int x; cin >> x; --x;
states[x].push_back(i);
}
dfs1(0, 0);
for(int i = 0; i<k; ++i){
int top = states[i][0];
for(auto v : states[i])
top = lca(top, v);
for(auto v : states[i])
++dif[v], --dif[top];
}
dfs2(0, 0);
for(int i = 1; i<n; ++i)
if(huh[i]==0 && cnt[i]==cnt[0])
++ans;
cout << (ans+1)/2 << '\n';
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |