Submission #247204

#TimeUsernameProblemLanguageResultExecution timeMemory
247204tqbfjotldLokahian Relics (FXCUP4_lokahia)C++17
0 / 100
7 ms640 KiB
#include "lokahia.h" #include <bits/stdc++.h> using namespace std; vector<int> thing[205]; int qLim = 400; int p[205]; bool vis[205]; int root(int a){ return p[a]==a?a:p[a]=root(p[a]); } priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > pq; int sz[205]; int queryCount = 0; int query(int a, int b){ if (queryCount>=qLim){ return -2; } if (a==b) return a; int res = CollectRelics(a,b); queryCount++; if (res!=-1){ thing[res].push_back(a); thing[res].push_back(b); //printf("add edge %d %d, %d %d\n",res,a,res,b); } return res; } int dfs(int node){ vis[node] = true; int res = 1; for (auto x : thing[node]){ if (!vis[x]){ res += dfs(x); } } return res; } int FindBase(int N){ if (N==1) return 0; for (int x = 0; x<N; x++){ pq.push({1,x}); p[x] = x; } int mn = -1; while (!pq.empty()){ if (pq.size()<3){ if (pq.size()==1) {mn = pq.top().second;pq.pop();} else{ auto a = pq.top(); pq.pop(); auto b = pq.top(); pq.pop(); int r = query(root(a.second),root(b.second)); if (r==-2) return -1; if (r==-1){ mn = sz[a.second]>sz[b.second]?a.second:b.second; } } continue; } auto a = pq.top(); pq.pop(); auto b = pq.top(); pq.pop(); auto c = pq.top(); pq.pop(); int res = query(root(a.second),root(b.second)); if (res==-2) return -1; if (res==-1){ int r2 = query(root(a.second),root(c.second)); if (r2==-2) return -1; if (r2==-1) { int r3 = query(root(b.second),root(c.second)); if (r3==-2) return -1; if (r3!=-1){ if (root(b.second)!=root(r3)){ p[root(b.second)] = r3; sz[root(r3)] += sz[root(b.second)]; } if (root(c.second)!=root(r3)){ p[root(c.second)] = r3; sz[root(r3)] += sz[root(c.second)]; } pq.push({sz[root(r3)],r3}); } } else{ if (root(a.second)!=root(r2)){ p[root(a.second)] = r2; sz[root(r2)] += sz[root(a.second)]; } if (root(c.second)!=root(r2)){ p[root(c.second)] = r2; sz[root(r2)] += sz[root(c.second)]; } pq.push({sz[root(r2)],r2}); } } else{ if (root(b.second)!=root(res)){ p[root(b.second)] = res; sz[root(res)] += sz[root(b.second)]; } if (root(a.second)!=root(res)){ p[root(a.second)] = res; sz[root(res)] += sz[root(a.second)]; } pq.push({sz[root(res)],res}); } } for (int x = 0; x<N; x++){ if (root(x)!=root(mn)){ query(x,root(mn)); } } for (int x = 0; x<N; x++){ for (int y = 0; y<N; y++){ vis[y] = false; } if (dfs(x)>N/2){ return x; } } return -1; }
#Verdict Execution timeMemoryGrader output
Fetching results...