Submission #1319669

#TimeUsernameProblemLanguageResultExecution timeMemory
1319669muhammad-mutahirEaster Eggs (info1cup17_eastereggs)C++20
10 / 100
39 ms1240 KiB
#include <bits/stdc++.h>
#include "grader.h"

using namespace std;

#define print(l) for(auto i:l) cout<<i<<" ";cout<<endl;
#define input(t,l,n) vector<t>l(n);for(int i = 0;i<n;i++)cin>>l[i];
// #define int long long
#define pb push_back
#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update> 
#define all(l) l.begin(),l.end()
#define pii pair<int,int>
#define fi first
#define se second

vector<vector<int>>adj,sub;
vector<int>pa;
map<int,int>pos;

void dfs(int v,int par){
	sub[v].pb(v);
	
	
	pa[v] = par;
	for(int i:adj[v]){
		if(pos[i])continue;
		if(i == par)continue;
		dfs(i,v);
		for(int j:sub[i]){
			sub[v].pb(j);
		}
	}
}
int findEgg (int N, vector < pair < int, int > > bridges){
	adj.clear();
	sub.clear();
	pa.clear();
	pos.clear();
	
	pa.resize(N+1);
	sub.resize(N+1);
	adj.resize(N+1);
	
	for(auto i:bridges){
		adj[i.fi].pb(i.se);
		adj[i.se].pb(i.fi);
	}
	dfs(1,1);

	int cur = 1;
	int space = sub[1].size();
	int t = 1000;
	while(t--){
		int cnt = 0;
		for(int i:sub[cur]){
			if(i == cur)continue;
			if(sub[i].size() == 1){
				cnt++;
			}
		}
		// cout<<cur<<" "<<space<<endl;
		// print(sub[cur]);
		if(sub[cur].size()-1 == cnt ){
			// cout<<"ex"<<endl;
			vector<int>chi;
			for(int i :sub[cur]){
				if(i == cur){
					continue;
				}
				chi.pb(i);
			}
			int l = 0;
			int r = chi.size();
			int p = -1;
			while(r-l>1){
				int mid = (l+r)/2;
				vector<int>ask;
				for(int i = l;i<mid;i++){
					if(chi[i] == cur)continue;
					ask.pb(chi[i]);
				}
				ask.pb(cur);
				// print(ask);
				int x = query(ask);
				if(ask.size() == 1){
					p = x;
				}
				if(x){
					r = mid;
				}
				else{
					l = mid;
				}
			}
			if(p == -1){
				p = query({cur});
			}
			if(p){
				return cur;
			}
			else{
				return chi[l];
			}
			
		}
		
		vector<vector<int>>ord;
		int df = 1e9;
		int val = -1;
		if(sub[cur].size() == 0)break;
		for(int i:sub[cur]){
			if(i == cur)continue;
			if(abs((int)sub[i].size()-(space-1)/2) <df){
				df = abs((int)sub[i].size()-space/2);
				val = i;
			}

		}
		// cout<<val<<endl;

		if(val == -1)break;
		
		// print(sub[val]);
		int x = query(sub[val]);
		if(x){
			cur = val;
		}
		else{
			for(auto i:sub[val]){
				pos[i] = 1;
			}
		}
		sub.clear();
		sub.resize(N+1);
		dfs(cur,pa[cur]);
		space = sub[cur].size();
	}
	return cur;
	
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...