This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#include "grader.h"
#include<unistd.h>
#define X first
#define Y second
using namespace std;
vector<int> g[1010];
vector<int> half;
vector<int> all;
vector<int> help;
vector<int> dod;
int have;
bool took[1010];
bool nxt[1010];
bool need[1010];
bool cango[1010];
/*
int calc;
int egg;
bool wrong;
*
int query(vector< int > v){
int ap[1009];
if (v.empty ()) return 0;
memset(ap, 0, sizeof(ap));
for (auto it = v.begin (); it != v.end (); it ++)
ap[*it] = 1;
queue < int > cc;
cc.push (v[0]), ap[v[0]] = 2;
while (!cc.empty ()){
int nod = cc.front ();
cc.pop ();
for (auto it = g[nod].begin(); it != g[nod].end (); it ++)
if (ap[*it] == 1)
ap[*it] = 2, cc.push (*it);
}
for (int i : v)
if (ap[i] == 1){
cout << "!!Something went wrong!!\n";
wrong = false;
return 0;
}
for (auto it = v.begin (); it != v.end (); it ++)
if (*it == egg) return 1;
return 0;
}
*/
bool dfs(int x, int last){
bool out = need[x];
for(int y : g[x]){
if(y == last) continue;
out |= dfs(y, x);
}
if(out){
all.push_back(x);
cango[x] = true;
}
return out;
}
void fix(){
dod.clear();
memset(need, 0, sizeof(need));
for(int x : all)
need[x] = true;
int start = all[0];
all.clear();
dfs(start, -1);
//for(int x : dod)
// all.push_back(x);
}
void findHalf(int x, int par){
if(have == 0)
return;
if(took[x]){
nxt[x] = true;
have--;
}
half.push_back(x);
for(int y : g[x]){
if(y == par || !cango[y])
continue;
findHalf(y, x);
}
}
int findEgg (int N, vector< pair< int, int > > graf ){
int on = N;
//calc = 0;
memset(took, 0, sizeof(took));
all.clear();
half.clear();
help.clear();
dod.clear();
have = 0;
memset(nxt, 0, sizeof(nxt));
memset(need, 0, sizeof(need));
for(int i = 0; i <= N; i++)
g[i].clear();
for(int i = 0; i < N - 1; i++){
int x = graf[i].X;
int y = graf[i].Y;
g[x].push_back(y);
g[y].push_back(x);
if(!took[x]){
all.push_back(x);
took[x] = true;
}
if(!took[y]){
all.push_back(y);
took[y] = true;
}
}
int ret = 1;
while(all.size() > 1){
//calc++;
memset(cango, false, sizeof(cango));
// for(int x : all) cout << x << " ";
fix();
/* cout << "\n";
for(int x : all) cout << x << " ";
cout << "\n";
for(int i = 1; i <= on; i++)
cout << took[i] << " ";
cout << "\n";
*/ have = N / 2;
half.clear();
memset(nxt, false, sizeof(nxt));
findHalf(all[0], -1);
/* cout << "half ";
for(int x : half) cout << x << " ";
cout << "\n";
*/
int ans = query(half);
// cout << "\n" << ans << " ans to the query\n";
// cout << "-----------------\n";
if(ans == 1){
N /= 2;
}
else{
if(ans != 0){
return 1;
}
N = N - N / 2;
}
help.clear();
for(int x : all){
if(took[x] and nxt[x] == ans)
help.push_back(x);
else
took[x] = false;
}
all.clear();
for(int x : help){
//cout << x << " took to the nxt query\n";
all.push_back(x);
}
}
if(all.size())
ret = all[0];
return ret;
}
/*
int main(){
srand(time(0) * getpid());
vector< pair<int, int> > edgs;
int maxn = 512;
wrong = true;
int cnt = 0;
while(wrong && cnt < 1000){
cnt++;
edgs.clear();
int m = (rand() % maxn) + 1;
cout << "N(nodes) = " << m << "\n";
int x = (rand() % m) + 1;
egg = x;
cout << "Egg is on " << x << "th node\n";
for(int j = 1; j < m; j++){
int y = (rand() % j) + 1;
cout << j + 1 << ' ' << y << "\n";
edgs.push_back({j + 1, y});
}
int ansp = findEgg(m, edgs);
cout << "Program found egg on " << ansp << " node, after asking " << calc << " queries\n";
cout << "Which is: ";
if(ansp == x)
cout << "true\n";
else
cout << "false\n";
cout << "-------------\n";
}
cout << cnt << " of 1000";
return 0;
} */
Compilation message (stderr)
eastereggs.cpp: In function 'int findEgg(int, std::vector<std::pair<int, int> >)':
eastereggs.cpp:111:6: warning: unused variable 'on' [-Wunused-variable]
111 | int on = N;
| ^~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |