Submission #219681

#TimeUsernameProblemLanguageResultExecution timeMemory
219681thebesLokahian Relics (FXCUP4_lokahia)C++17
77 / 100
6 ms768 KiB
#include "lokahia.h" #include <bits/stdc++.h> using namespace std; const int MN = 205; mt19937 mt(time(0)); int rng(int l,int r){return (mt()%(r-l+1))+l;} set<int> elem[MN], bel[MN], adj[MN]; set<pair<int,int>> use; int ord[MN], a, b; int FindBase(int N){ if(N==1) return 0; for(int i=0;i<min(124,N*(N-1)/2);i++){ int x = rng(0,N-1), y = rng(0,N-1); while(x==y||use.count({x,y})){ x = rng(0,N-1), y =rng(0,N-1); } use.insert({x,y}); int rt = CollectRelics(x, y); if(rt!=-1){ elem[rt].insert(x); elem[rt].insert(y); bel[x].insert(rt); bel[y].insert(rt); } else{ adj[x].insert(y); adj[y].insert(x); } } for(int i=0;i<N;i++) ord[i]=i; sort(ord,ord+N,[](int i,int j){return elem[i].size()>elem[j].size();}); a=ord[0], b=ord[1]; int Q = min(124,N*(N-1)/2); int rt = CollectRelics(a,b); if(rt==-1&&elem[b].size()<Q/4-5) rt=a; if(rt!=-1){ int cnt = 1; for(int i=0;i<N;i++){ if(i!=rt&&CollectRelics(rt,i)!=-1) cnt++; } if(cnt>(N/2)) return rt; else return -1; } else{ bel[a].insert(a); bel[b].insert(b); adj[a].insert(b); adj[b].insert(a); int ca = bel[a].size(), cb = bel[b].size(); for(int i=0;i<N;i++){ int chka=1, chkb=0; for(auto v : adj[i]){ if(bel[a].count(v)) chka=0; if(bel[b].count(v)) chkb=0; } if(bel[a].count(i)) chka=0; if(bel[b].count(i)) chkb=0; if(chka&&CollectRelics(a,i)!=-1) ca++; if(chkb&&CollectRelics(b,i)!=-1) cb++; } if(ca>(N/2)) return a; else if(cb>(N/2)) return b; else return -1; } }

Compilation message (stderr)

lokahia.cpp: In function 'int FindBase(int)':
lokahia.cpp:36:30: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if(rt==-1&&elem[b].size()<Q/4-5) rt=a;
                ~~~~~~~~~~~~~~^~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...