Submission #1340613

#TimeUsernameProblemLanguageResultExecution timeMemory
1340613hyyhLibrary (JOI18_library)C++20
0 / 100
1 ms332 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;
						l = r;
					}
					r = md-1;
				}
				else l = md+1;
			}
		}
		else if(ret < last){
			int l = 0;
			int r = com.size()-1;
			int find1;
			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);
						}
						else{
							connect[com[md].f.s].emplace_back(i);
							connect[i].emplace_back(com[md].f.s);
						}
						find1 = md;
						l = r;
					}
					r = md-1;
				}
				else l = md+1;
			}
			l = 0;
			r = com.size()-1;
			int find2;
			while(l <= r){
				int md = l+(r-l)/2;
				bitset<N> bs(0);
				for(int i{l};i <= md;i++){
					if(i != find1) bs |= com[i].s;
				}
				if(bs == 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;
				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);
						}
						else{
							connect[com[md].f.s].emplace_back(i);
							connect[i].emplace_back(com[md].f.s);
						}
						find2 = md;
						l = r;
					}
					r = md-1;
				}
				else l = md+1;
			}
			//cout << find1 << " " << find2 << endl;
			com[find1].s |= com[find2].s;
			if(com[find1].f.f < com[find2].f.f){
				com[find1].f.s = com[find2].f.s;
			}
			else{
				com[find1].f.f = com[find2].f.f;
			}
			com.erase((com.begin()+find2));
		}
		last = ret;
	}
	int beg;
	for(int i{};i < n;i++){
		if(connect[i].size() == 0){
			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);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...