답안 #360142

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
360142 2021-01-27T14:28:40 Z amunduzbaev Easter Eggs (info1cup17_eastereggs) C++14
81 / 100
82 ms 1140 KB
#include <bits/stdc++.h>
#include "grader.h"
 
#ifndef EVAL
#include "grader.cpp"
#endif
 
#define pb push_back
#define ff first
#define ss second
#define sz(x) (int)x.size()
#define pii pair<int, int>
 
using namespace std;
 
const int NN = 513;
vector<pii> edges[NN];
vector<int> vv[NN];
int nn, used[NN];
bool ok;
 
void dfs(int u, int p = -1){
	//if(ok) cout<<u<<" ";
	vv[u].pb(u);
	for(auto x:edges[u]){
		if(x.ff == p || used[x.ss]) continue;
		dfs(x.ff, u);
		for(auto xx:vv[x.ff]) vv[u].pb(xx);
	}
}
 
/*
 
13
1 2
1 5
1 6
2 3
2 4
1 7
7 8
7 9
8 10
8 11
9 12
9 13

13
1 2 3 4 5 6 7 8 9 10 11 12 13

3
1 2
2 3

3
1 2 3

*/
 
int dfs_cc(int u, int p = -1){
	pii mx = {-1, -1};
	for(auto x:edges[u]){
		if(used[x.ss] || x.ff == p) continue;
		if(sz(vv[x.ff]) > mx.ff) mx.ff = sz(vv[x.ff]), mx.ss = x.ff;
	}
	if(mx.ff * 2 >= nn) return dfs_cc(mx.ss, u);
	return u;
}
 
int solve(int cur){
	if(nn == 1) return cur;
	for(int i=0;i<NN;i++) vv[i].clear();
	dfs(cur);
	
	//cout<<"\n";
	//cout<<nn<<" "<<cur<<"\n";
	if(nn == 1) return 0;
	int centr = dfs_cc(cur);
	
	for(int i=0;i<NN;i++) vv[i].clear();
	dfs(centr);
	vector<pair<int, pii>> childs;
	for(auto x:edges[centr]) childs.pb({sz(vv[x.ff]), x});
	
	sort(childs.begin(), childs.end());
	vector<int> qq = vv[childs.back().ss.ff], start;
	qq.pb(centr);
	
	vector<int> uu(NN, 0);
	uu[childs.back().ss.ss] = 1;
	childs.pop_back();
	
	int last = -1, nw = -1, i;
	
	for(i=0;i<sz(childs);i++){
		auto x = childs[i];
		last = sz(qq);
		nw = x.ff + last;
		if(abs(nw*2 - nn) <= abs(nn - last*2)) { for(auto xx : vv[x.ss.ff]) qq.pb(xx); }
		else { break; } //for(auto xx : vv[x.ss.ff]) start.pb(xx);
		uu[x.ss.ss] = 1;
	}
	
	for(;i<sz(childs);i++){
		auto x = childs[i];
		for(auto xx : vv[x.ss.ff]) start.pb(xx);
		//if(sz(start) 
	}
	
	for(auto &x:qq) x += 1;
	
	//for(auto x:qq) cout<<x<<" ";
	//cout<<"\n";
	//for(auto x:start) cout<<x<<" ";
	//cout<<"\n___________\n";
	
	int res = query(qq);
	
	if(res){
		for(auto x:edges[centr]) if(!uu[x.ss])  used[x.ss] = 1;
		nn = sz(qq);
		if(nn == 2){
			if(query({qq.back()})) return qq.back()-1;
			else { qq.pop_back(); return qq.back()-1; }
		}
		if(nn == 1) return centr;
		return solve(centr);
	}
	else{
		for(auto x:edges[centr]) if(uu[x.ss]) used[x.ss] = 1;
		nn = (nn - sz(qq));
		if(sz(start) == 1) return start.back();
		if(sz(start) == 2){
			if(query({start.back()+1})) return start.back();
			else { start.pop_back(); return start.back(); }
		}
		nn++;
		return solve(centr);
	}
}
 
int findEgg (int N, vector < pair < int, int > > bridges){
	memset(used, 0, sizeof used);
	for(int i=0;i<NN;i++) edges[i].clear(), vv[i].clear();
	nn = N;
	for(int i=0;i<sz(bridges);i++){
		edges[bridges[i].ff-1].pb({bridges[i].ss-1, i});
		edges[bridges[i].ss-1].pb({bridges[i].ff-1, i});
	}
	return solve(0)+1;
}
# 결과 실행 시간 메모리 Grader output
1 Partially correct 2 ms 364 KB Number of queries: 5
2 Partially correct 2 ms 364 KB Number of queries: 6
3 Partially correct 1 ms 364 KB Number of queries: 5
4 Partially correct 1 ms 364 KB Number of queries: 5
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 492 KB Number of queries: 9
2 Partially correct 11 ms 364 KB Number of queries: 10
3 Partially correct 22 ms 512 KB Number of queries: 11
4 Partially correct 22 ms 492 KB Number of queries: 10
# 결과 실행 시간 메모리 Grader output
1 Partially correct 82 ms 1140 KB Number of queries: 10
2 Partially correct 20 ms 492 KB Number of queries: 10
3 Partially correct 21 ms 512 KB Number of queries: 11
4 Partially correct 22 ms 492 KB Number of queries: 10