제출 #687364

#제출 시각아이디문제언어결과실행 시간메모리
687364alexddEaster Eggs (info1cup17_eastereggs)C++17
81 / 100
234 ms752 KiB
#include <bits/stdc++.h> #include "grader.h" using namespace std; int n; vector<int> con[520]; vector<int> children[520]; vector<int> forniv[520]; int level[520]; bool visited[520]; int parent[520]; int rez=-1; int mxmniv=0; int root; int cntq; void dfs(int nod) { visited[nod]=1; mxmniv = max(mxmniv, level[nod]); forniv[level[nod]].push_back(nod); for(auto adj:con[nod]) { if(!visited[adj]) { level[adj] = level[nod]+1; parent[adj]=nod; dfs(adj); for(int i=0;i<children[adj].size();i++) children[nod].push_back(children[adj][i]); } } children[nod].push_back(nod); } vector<int> aux; void dfs2(int nod, int niv) { visited[nod]=1; aux.push_back(nod); for(auto adj:con[nod]) { if(!visited[adj] && level[adj]<=niv) { dfs2(adj, niv); } } } bool verif_nivel(int niv) { for(int i=1;i<=n;i++) visited[i]=0; aux.clear(); dfs2(root,niv); cntq--; return query(aux); } int find_nivel() { int st,dr,mij; st=1; dr=mxmniv; while(st<=dr) { if(st==dr) return st; mij=(st+dr)/2; if(verif_nivel(mij)) dr=mij; else st=mij+1; } return mij; } int fr[520]; bool verif_interval(int le, int ri, int niv)///returneaza 1 daca oul se afla in nodurile de pe forniv[niv][le..ri] { aux.clear(); for(int i=1;i<=n;i++) fr[i]=0; for(int i=le;i<=ri;i++) { int cur=forniv[niv][i]; while(cur!=-1) { fr[cur]++; cur = parent[cur]; } } for(int i=1;i<=n;i++) { if(fr[i]>0) aux.push_back(i); } cntq--; return query(aux); } int pls=1; void dfs3(int nod, int dist) { pls=max(pls,dist); visited[nod]=1; for(auto adj:con[nod]) { if(!visited[adj]) dfs3(adj,dist+1); } } int find_root() { int mnm=n+2,care; for(int i=1;i<=n;i++) { for(int i=1;i<=n;i++) visited[i]=0; pls=1; dfs3(i,1); if(pls<mnm) { mnm=pls; care=i; } } return care; } int findEgg (int N, vector < pair < int, int > > bridges) { mt19937 rng(time(nullptr)); n=N; if(n<=16) cntq = 4; else if(n<=500) cntq = 9; else cntq = 9; for(int i=1;i<=N;i++) { visited[i]=0; con[i].clear(); children[i].clear(); forniv[i].clear(); } rez=-1; mxmniv=0; for(auto x:bridges) { con[x.first].push_back(x.second); con[x.second].push_back(x.first); } root=(rng()%n)+1; root = find_root(); level[root] = 1; parent[root] = -1; for(int i=1;i<=n;i++) visited[i]=0; dfs(root); int niv = find_nivel(); int st,dr,mij=0; st=0; dr=forniv[niv].size()-1; while(st<=dr) { if(st==dr) return forniv[niv][st]; if(dr-st+1<=cntq) { for(int i=st;i<=dr;i++) { if(query({forniv[niv][i]})) return forniv[niv][i]; } } mij=(st+dr)/2; if(verif_interval(st,mij,niv)) dr=mij; else st=mij+1; } return forniv[niv][mij]; }

컴파일 시 표준 에러 (stderr) 메시지

eastereggs.cpp: In function 'void dfs(int)':
eastereggs.cpp:28:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   28 |             for(int i=0;i<children[adj].size();i++)
      |                         ~^~~~~~~~~~~~~~~~~~~~~
eastereggs.cpp: In function 'int find_root()':
eastereggs.cpp:126:12: warning: 'care' may be used uninitialized in this function [-Wmaybe-uninitialized]
  126 |     return care;
      |            ^~~~
eastereggs.cpp: In function 'int find_nivel()':
eastereggs.cpp:60:15: warning: 'mij' may be used uninitialized in this function [-Wmaybe-uninitialized]
   60 |     int st,dr,mij;
      |               ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...