Submission #1303270

#TimeUsernameProblemLanguageResultExecution timeMemory
1303270minh30082008Mergers (JOI19_mergers)C++20
100 / 100
564 ms106460 KiB
#include<bits/stdc++.h> #define fi first #define se second #define FOR(i, k, n) for(int i = k; i <= n; i++) #define FOR1(i, k, n) for(int i = k; i >= n; i--) #define pb push_back #define fastio ios::sync_with_stdio(0); cin.tie(0); cout.tie(0) #define vi vector<int> #define pii pair<int, int> #define vii vector<pii> #define ll long long #define vll vector<ll> #define pll pair<ll, ll> #define re return 0 #define mii map<int, int> #define input "ALONE.inp" #define output "ALONE.out" #define rf freopen(input, "r", stdin); freopen(output, "w", stdout) using namespace std; const int maxn = 5e5 + 5; const int mod = 1e9 + 7; const int base = 998244353; const int base1 = 31; const int SZ = 320; const ll INF = 1e18; void add(int &a, int b) { a += b; if(a >= mod) a -= mod; if(a < 0) a += mod; } mt19937 rd(chrono::steady_clock::now().time_since_epoch().count()); int rand(int l, int r) { return uniform_int_distribution<int>(l, r) (rd); } int par[20][maxn], depth[maxn], mindepth[maxn]; int cha[maxn], a[maxn]; int type[maxn]; int cnt[maxn]; vi adj[maxn]; void DFS(int u) { for(auto v : adj[u]) { if(v == par[0][u]) continue; depth[v] = depth[u] + 1; par[0][v] = u; FOR(i, 1, 19) par[i][v] = par[i - 1][par[i - 1][v]]; DFS(v); } } int LCA(int u, int v) { if(depth[u] < depth[v]) swap(u, v); int h = depth[u] - depth[v]; FOR1(i, 19, 0) if((h >> i) & 1) u = par[i][u]; if(u == v) return u; FOR1(i, 19, 0) if(par[i][u] != par[i][v]) { u = par[i][u]; v = par[i][v]; } return par[0][u]; } void solve(int u) { for(auto v : adj[u]) { if(v == par[0][u]) continue; solve(v); mindepth[u] = min(mindepth[u], mindepth[v]); cnt[u] += cnt[v]; type[u] += type[v]; } if(mindepth[u] == depth[u]) { if(u != 1) type[u] = 1; if(cnt[u] == 0) cnt[u] = 1; } } int main() { fastio; int n, k; cin >> n >> k; FOR(i, 1, n - 1) { int u, v; cin >> u >> v; adj[u].pb(v); adj[v].pb(u); } FOR(i, 1, n) cin >> a[i]; DFS(1); FOR(i, 1, n) { if(cha[a[i]] == 0) cha[a[i]] = i; else cha[a[i]] = LCA(cha[a[i]], i); } FOR(i, 1, n) mindepth[i] = depth[cha[a[i]]]; solve(1); if(type[1] == 0) cout << 0; else if(type[1] == 1) cout << (cnt[1] / 2) + 1; else cout << (cnt[1] + 1) / 2; re; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...