Submission #1177862

#TimeUsernameProblemLanguageResultExecution timeMemory
1177862trashaccount9월 (APIO24_september)C++20
30 / 100
1094 ms11848 KiB
#include "september.h" #include <bits/stdc++.h> using namespace std; const int NM = 1e5; int N, M; vector <int> son[NM+5]; int timer, tin[NM+5], tout[NM+5]; int sum[NM+5]; int parent[NM+5], sz[NM+5], comp; void dfs(int u){ tin[u] = ++timer; for (int v : son[u]) dfs(v); tout[u] = timer; } bool is_ancestor(int u, int v){ return tin[u] <= tin[v] && tout[u] >= tout[v]; } void make_set(int v){ parent[v] = v; sz[v] = 1; } int find_set(int v){ return parent[v] == v ? v : parent[v] = find_set(parent[v]); } void union_sets(int u, int v){ u = find_set(u); v = find_set(v); if (u == v) return; if (sz[u] < sz[v]) swap(u, v); parent[v] = u; sz[u] += sz[v]; comp--; } int solve(int _N, int _M, vector <int> F, vector <vector <int> > S){ N = _N, M = _M; for (int i = 0; i < N; i++) son[i].clear(); for (int i = 1; i < N; i++){ int p = F[i]; son[p].push_back(i); } timer = 0; dfs(0); for (int i = 1; i < N; i++) make_set(i); comp = N-1; for (int i = 0; i < M; i++){ for (int j = 0; j < N; j++) sum[j] = 0; for (int j = 0; j < N-1; j++) for (int k = j+1; k < N-1; k++) if (is_ancestor(S[i][j], S[i][k])) sum[j]++, sum[k]--; for (int j = 0; j+1 < N-1; j++){ if (j > 0) sum[j] += sum[j-1]; if (sum[j] > 0) union_sets(S[i][j], S[i][j+1]); } } return comp; }
#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...
#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...