제출 #1340658

#제출 시각아이디문제언어결과실행 시간메모리
1340658hyyh도서관 (JOI18_library)C++20
19 / 100
117 ms424 KiB
// #include <cstdio>
// #include <vector>
// #include <bitset>
// #include <iostream>
// #include <stack>
// #include "library.h"
// using namespace std;
// #define f first
// #define s second

// int const N = 1010;

// void Solve(int n){
// 	vector<pair<pair<int,int>,bitset<N>>> com;
// 	vector<vector<int>> connect(n);
// 	vector<int> M(n,0);
// 	int last = 0;
// 	for(int i{}; i < n; i++) {
// 		M[i] = 1;
// 		int ret = Query(M);
// 		// for(auto [n,k]:com){
// 		// 	cout << k << " " << n.f << "-" << n.s << endl;
// 		// }
// 		// cout << ret << " " << last << endl;
//  		// cout << "_________" << endl;
// 		if(ret > last){
// 			bitset<N> temp;
// 			temp[i] = 1;
// 			com.emplace_back(make_pair(i,i),temp);
// 		}
// 		else if(ret == last){
// 			int l = 0;
// 			int r = com.size()-1;
// 			while(l <= r){
// 				int md = l+(r-l)/2;
// 				bitset<N> bs(0);
// 				for(int i{l};i <= md;i++){
// 					bs |= com[i].s;
// 				}
// 				vector<int> temp(n,0);
// 				for(int j{};j < n;j++){
// 					if(bs[j]) temp[j] = 1;
// 				}
// 				temp[i] = 1;
// 				int Bret = Query(temp);
// 				if(Bret == (md-l+1)){
// 					if(md == l){
// 						com[md].s[i] = 1;
// 						vector<int> tempt(n,0);
// 						tempt[com[md].f.f] = 1;
// 						tempt[i] = 1;
// 						if(Query(tempt) == 1){
// 							connect[com[md].f.f].emplace_back(i);
// 							connect[i].emplace_back(com[md].f.f);
// 							com[md].f.f = i;
// 						}
// 						else{
// 							connect[com[md].f.s].emplace_back(i);
// 							connect[i].emplace_back(com[md].f.s);
// 							com[md].f.s = i;
// 						}
// 						//cout << md << " " << i << endl;
// 						break;
// 					}
// 					r = md-1;
// 				}
// 				else l = md+1;
// 			}
// 		}
// 		else if(ret < last){
// 			int find1 = -1;
// 			int find2 = -1;
// 			int l = 0;
// 			int r = com.size()-1;
// 			while(l <= r){
// 				int md = l+(r-l)/2;
// 				bitset<N> bs(0);
// 				for(int j{l};j <= md;j++){
// 					bs |= com[j].s;
// 				}
// 				vector<int> temp(n, 0);
// 				for(int j{};j < n;j++){
// 					if(bs[j]) temp[j] = 1;
// 				}
// 				temp[i] = 1;
// 				int Bret = Query(temp);
// 				if(Bret <= (md-l+1)){
// 					if(md == l){
// 						vector<int> tempt(n, 0);
// 						tempt[com[md].f.f] = 1; tempt[i] = 1;
// 						if(Query(tempt) == 1){
// 							connect[com[md].f.f].push_back(i);
// 							connect[i].push_back(com[md].f.f);
// 						}
// 						else{
// 							connect[com[md].f.s].push_back(i);
// 							connect[i].push_back(com[md].f.s);
// 						}
// 						find1 = md;
// 						//cout << md << " " << i << endl;
// 						break;
// 					}
// 					r = md-1;
// 				} else l = md+1;
// 			}
// 			l = 0;
// 			r = com.size()-1;
// 			while(l <= r){
// 				int md = l+(r-l)/2;
// 				bitset<N> bs(0); int cnt = 0;
// 				for(int j{l};j <= md;j++){
// 					if(j != find1){
// 						bs |= com[j].s;
// 						cnt++;
// 					}
// 				}
// 				if(cnt == 0){
// 					l = md+1;
// 					continue;
// 				}
// 				vector<int> temp(n, 0);
// 				for(int j{};j < n;j++){
// 					if(bs[j]) temp[j] = 1;
// 				}
// 				temp[i] = 1;
// 				if(Query(temp) <= cnt){
// 					if(md == l){
// 						vector<int> tempt(n, 0);
// 						tempt[com[md].f.f] = 1; tempt[i] = 1;
// 						if(Query(tempt) == 1) {
// 							connect[com[md].f.f].push_back(i);
// 							connect[i].push_back(com[md].f.f);
// 						} else {
// 							connect[com[md].f.s].push_back(i);
// 							connect[i].push_back(com[md].f.s);
// 						}
// 						find2 = md; break;
// 					}
// 					r = md-1;
// 				} else l = md+1;
// 			}
// 			int f1 = find1;
// 			int f2 = find2;
// 			if(f1 > f2) swap(f1, f2);
// 			int L = (connect[com[f1].f.f].size() <= 1) ? com[f1].f.f : com[f1].f.s;
// 			int R = (connect[com[f2].f.f].size() <= 1) ? com[f2].f.f : com[f2].f.s;
// 			com[f1].s |= com[f2].s;
// 			com[f1].s[i] = 1;
// 			com[f1].f.f = L;
// 			com[f1].f.s = R;
// 			com.erase(com.begin() + f2);
// 		}
// 		last = ret;
// 	}
// 	int beg = n;
// 	for(int i{};i < n;i++){
// 		if(connect[i].size() <= 1){
// 			beg = i;
// 			break;
// 		}
// 	}
// 	// for(auto [n,k]:com) cout << k << endl;
// 	// //cout << ret << " " << last << endl;
// 	// cout << "_________" << endl;
// 	stack<int> st;
// 	st.emplace(beg);
// 	vector<int> ans;
// 	vector<bool> in(n);
// 	while(!st.empty()){
// 		int pos = st.top();st.pop();
// 		if(in[pos]) continue;
// 		in[pos] = true;
// 		ans.emplace_back(pos+1);
// 		for(auto k:connect[pos]){
// 			st.emplace(k);
// 		}
// 	}
// 	// for(int i{};i < n;i++){
// 	// 	cout << i << " : ";
// 	// 	for(auto k:connect[i]) cout << k << " ";
// 	// 	cout << endl;
// 	// }
// 	// for(auto k:ans) cout << k << " ";
// 	Answer(ans);
// }

#include <cstdio>
#include <vector>
#include <bitset>
#include <iostream>
#include <stack>
#include "library.h"
using namespace std;
#define f first
#define s second

int const N = 210;

vector<int> adj[N];

void Solve(int n){
	for(int i{};i < n;i++){
		for(int j{};j < i;j++){
			vector<int> temp(n,0);
			temp[i] = 1;
			temp[j] = 1;
			if(Query(temp) == 1){
				adj[i].emplace_back(j);
				adj[j].emplace_back(i);
			}
		}
	}
	vector<int> ans;
	stack<int> q;
	vector<bool> vis(n,0);
	int beg = 0;
	for(int i{};i < n;i++){
		if(adj[i].size() <= 1) beg = i;
	}
	q.emplace(beg);
	while(!q.empty()){
		int hd = q.top();q.pop();
		if(vis[hd]) continue;
		vis[hd] = 1;
		ans.emplace_back(hd+1);
		for(auto k:adj[hd]){
			q.emplace(k);
		}
	}
	//for(auto k:ans) cout << k << " ";
	Answer(ans);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...