Submission #360132

#TimeUsernameProblemLanguageResultExecution timeMemory
360132tengiz05Easter Eggs (info1cup17_eastereggs)C++17
10 / 100
30 ms620 KiB
#include <bits/stdc++.h>
#include "grader.h"
#ifndef EVAL
#include "grader.cpp"
#endif
using namespace std;
const int MAXN = 515;
vector<int> edges[MAXN];
int n;
int sz[MAXN];
bool used[MAXN];
void recalc_size(int u, int p=-1){
	sz[u] = 1;
	for(auto v : edges[u]){
		if(v == p || used[v])continue;
		recalc_size(v,u);
		sz[u] += sz[v];
	}
}
int nn;
int find_centroid(int u, int p=-1){
	for(auto v : edges[u]){
		if(!used[v] && v != p && sz[v] > nn/2)return find_centroid(v,u);
	}return u;
}
vector<int> ttt;
void dfs(int u,int p){
	ttt.push_back(u);
	for(auto v : edges[u]){
		if(v == p || used[v])continue;
		dfs(v,u);
	}
}
int findEgg(int N, vector<pair<int,int>> bridges){
	n = N;
	for(auto [u, v] : bridges){
		edges[u].push_back(v);
		edges[v].push_back(u);
	}
	int now = 1;
	while(true){
		recalc_size(now);
		nn = sz[now];
		int u = find_centroid(now);
		if(nn == 2){
			if(query({now}) == 0){
				int x = -1;
				for(auto v : edges[now])if(!used[v])x=v;
				assert(~x);
				now = x;
			}break;
		}else if(nn == 1){
			break;
		}int sc=0;
		now = u;
		int x = -1;
		for(auto v : edges[now])if(!used[v])x=v;
		if(x==-1){return 0;assert(~x);}
		sc = x;
		//~ ttt.clear();
		//~ dfs(now,now);
		//~ for(auto x : ttt){
			//~ cout << x << ' ';}cout << '\n';
		vector<int> f, s;
		ttt.clear();
		dfs(now,sc);
		f = ttt;
		ttt.clear();
		dfs(sc,now);
		s = ttt;
		if(query(f) == 1){
			used[sc] = true;
		}else {
			used[now] = true;
			now = sc;
		}
	}
	for(int i=1;i<=n;i++){
		edges[i].clear();
	}memset(used,0,sizeof used);
	return now;
}



#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...