750F - New Year and Finding Roots - CodeForces Solution


constructive algorithms implementation interactive trees *2800

Please click on ads to support us..

C++ Code:

#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<vector>
std::vector<std::vector<int>>buc;
std::vector<int>my_query(const int x){
	if(!buc[x].empty())return buc[x];
	std::cout<<'?'<<' '<<x<<'\n';
	std::cout.flush();
	int k;
	std::cin>>k;
	if(!k)exit(0);
	buc[x].resize(k);
	for(int i=0;i<k;i++)std::cin>>buc[x][i];
	return buc[x];
}
void answer(const int x){
	std::cout<<'!'<<' '<<x<<'\n';
	std::cout.flush();
}
int find_leaf(int u,int from,std::vector<int>&ans){
	ans.emplace_back(u);
	for(bool flag=true;flag;){
		flag=false;
		std::vector<int>_u=my_query(u);
		if((int)_u.size()==2)return u;
		for(int v:_u)
			if(v!=from){
				from=u,u=v;
				ans.emplace_back(u);
				flag=true;
				break;
			}
	}
	return 0;
}
void solve(const int h){
	int tmp;
	buc.clear();
	buc.resize(1<<h);
	int lim=1<<h,a,b;
	for(int i=1,cur;i<h;i++){
		cur=i*(i+1)/2+(1<<(h-i))-2;
		if(lim>cur)lim=cur,a=i,b=h-i;
	}
	int x=1;
	my_query(x);
	if((int)buc[x].size()==2)return answer(x);
	std::vector<int>chain;
	if((tmp=find_leaf(buc[x][0],x,chain)))return answer(tmp);
	std::reverse(chain.begin(),chain.end());
	if((tmp=find_leaf(x,buc[x][0],chain)))return answer(tmp);
	while((int)chain.size()<2*a-1){
		const int _h=((int)chain.size()+1)>>1,y=chain[_h-2],z=chain[_h];
		chain.resize(_h);
		x=chain.back();
		if((tmp=find_leaf(buc[x][0]^buc[x][1]^buc[x][2]^y^z,x,chain)))return answer(tmp);
	}
	{
		const int _h=((int)chain.size()+1)>>1,y=chain[_h-2],z=chain[_h];
		chain.resize(_h);
		x=chain.back();
		std::vector<std::pair<int,int>>f,g;
		f.emplace_back(buc[x][0]^buc[x][1]^buc[x][2]^y^z,x);
		int cnt=(1<<(h-_h))-1;
		for(int i=1;i<h;i++){
			for(const std::pair<int,int>&p:f){
				const int u=p.first,from=p.second;
				if(!(--cnt)||(int)my_query(u).size()==2)return answer(u);
				for(int v:buc[u])
					if(v!=from)
						g.emplace_back(v,u);
			}
			std::swap(f,g),g.clear();
		}
	}
	return answer(-1);
}
int main(){
	int t;
	std::cin>>t;
	for(int i=1,h;i<=t;i++){
		std::cin>>h;
		solve(h);
	}
	return 0;
}


Comments

Submit
0 Comments
More Questions

580A- Kefa and First Steps
1472B- Fair Division
996A - Hit the Lottery
MSNSADM1 Football
MATCHES Playing with Matches
HRDSEQ Hard Sequence
DRCHEF Doctor Chef
559. Maximum Depth of N-ary Tree
821. Shortest Distance to a Character
1441. Build an Array With Stack Operations
1356. Sort Integers by The Number of 1 Bits
922. Sort Array By Parity II
344. Reverse String
1047. Remove All Adjacent Duplicates In String
977. Squares of a Sorted Array
852. Peak Index in a Mountain Array
461. Hamming Distance
1748. Sum of Unique Elements
897. Increasing Order Search Tree
905. Sort Array By Parity
1351. Count Negative Numbers in a Sorted Matrix
617. Merge Two Binary Trees
1450. Number of Students Doing Homework at a Given Time
700. Search in a Binary Search Tree
590. N-ary Tree Postorder Traversal
589. N-ary Tree Preorder Traversal
1299. Replace Elements with Greatest Element on Right Side
1768. Merge Strings Alternately
561. Array Partition I
1374. Generate a String With Characters That Have Odd Counts