# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1157121 | LolkasMeep | September (APIO24_september) | C++20 | 0 ms | 0 KiB |
#include "bits/stdc++.h"
using namespace std;
typedef long long int ll;
int dsuParents[100005];
int dsuSizes[100005];
int getParent(int node){
if(dsuParents[node] = node) return node;
dsuParents[node] = getParent(dsuParents[node]);
return dsuParents[node];
}
void createNode(int node){
dsuParents[node] = node;
dsuSizes[node] = 1;
}
bool merge(int a, int b){
int pA = getParent(a);
int pB = getParent(b);
if (pA == pB) return false;
if(dsuSizes[pA] > dsuSizes[pB]) swap(pA, pB);
dsuParents[pA] = pB;
dsuSizes[pB] += dsuSizes[pA];
return true;
}
int solveM(int N, vector<int> &F, vector<int> S), vector<unordered_set<int>> &adjList;{
for(int i=0;i<100005;i++){
dsuParents[i]=-1;
dsuSizes[i]=0;
}
bool visited[100005];
visited[0] = true;
int components = 1;
for(int i = S.size() - 1; i >= 0; i--){
components++;
for(int node : adjList[S[i]]){
if(visited[node] && merge(S[i], node)) components--;
}
visited[S[i]] = true;
}
}
int solve(int N, int M, vector<int> F,vector<vector<int>> S){
int minSize = 99999999;
vector<unordered_set<int>> adjList;
adjList.resize();
for(int i = 1; i < N; i++){
adjList[i].insert(F[i]);
adjList[F[i]].insert(i);
}
for(int j = 0; j < M; j++) minSize = min(minSize, solveM(N, F, S[j], adjList));
return minSize;
}