Submission #1345370

#TimeUsernameProblemLanguageResultExecution timeMemory
1345370ThylOneTower (BOI25_tow)C++17
0 / 100
689 ms468 KiB
//####################
//Tower
//####################
#include<bits/stdc++.h> 


#define pb push_back
#define eb emplace_back
#define rall(x) x.rbegin(), x.rend()
#define all(x) x.begin(), x.end()
 
using namespace std;
vector<pair<int,int>> query(int x, int y , int z){
	cout.flush();
	cout <<"? "<<x<<' '<<y<<' ' <<z<<endl;
	int r;cin>>r;
	vector<pair<int,int>> re;
	for(int i = 0 ; i < r ; i++){
		int a,b;cin>>a>>b;
		if(a>b)swap(a,b);
		re.emplace_back(a,b);
	}
	cout.flush();
	
	return re;
}
void answer(vector<int> ans){
	cout.flush();
	cout <<"! ";
	for(int u:ans)cout <<u<<" ";
	cout << endl;
	cout.flush();
}
bool in(int x, pair<int,int> p){
	return p.first == x || p.second == x;
}
void solve(){
	int n;cin>>n;

	if(n==3){
		answer({0,1,2});
	}else{
		/*
		Des que on q un noeud plsu proche que neihbor, on le prend
		*/
		pair<int,int> arr = {0,1};
		for(int i = 1; i < n ; i++){
			if(!in(i, arr)){
				auto q = query(arr.second, arr.first, i);
				auto best = q[0];
				if(in(best.first,arr) || in(best.second, arr)){
					arr = best;
				}
			}
		}
		END :
		
		vector<int> ans = {arr.first, arr.second};
		set<int> S;
		S.insert(ans[0]);
		S.insert(ans[1]);

		for(int t = 2 ; t < n ; t++){
			
			for(int x = 0 ; x < n ; x++){
				if(S.count(x)==0){
					auto q = query(ans[ans.size()-1], ans[ans.size()-2],x);
					if(q.size()==2){
						if(q[0] == make_pair(ans[ans.size()-1], ans[ans.size()-2])){
							swap(q[0], q[1]);
						}
						if(q[0].first == x)
							swap(q[0].first, q[0].second);

						S.insert(x);
						if(q[0].first != ans.back() && t==2)
							swap(ans[0], ans[1]);
						ans.emplace_back(x);
						break;
					}
				}
			}
		}
		answer(ans);
	}
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T, K;cin>>T>>K;
	for(int i  = 0 ; i < T ; i++){
		solve();
	}
	return 0;
};
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...