제출 #1226169

#제출 시각아이디문제언어결과실행 시간메모리
1226169ansoriMinerals (JOI19_minerals)C++20
40 / 100
313 ms11344 KiB
#include "minerals.h"
#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
int rand(int n){
	long long x = rng();
	return abs(x) % n;
}
void Answer(int x, int y);
int Query(int x);
vector<pair<vector<int> , vector<int>>> vec;
set<int> st;
int lst;
int ask(int x){
	lst = Query(x);
	if(st.find(x) == st.end()) st.insert(x);
	else st.erase(x);
	//for(auto to : st) cout << to << ' ';
	//cout << '\n';
	return lst;
}
void clr(){
	for(auto to : st) ask(to);
	st.clear();
	return ;
}
void f(vector<int> v){
	if(v.size() == 0){
		return ;
	}
	if(v.size() == 2){
		vec.push_back({{v[0]} , {v[1]}});
		return ;
	}
	for(auto to : v){
		// cout << to << ' ';
	}
	//cout << '\n';
	int sz = v.size();
	set<int> s1 , s2;
	for(int i = 0;i < sz / 2; ++ i){
		s1.insert(v[i]);
		if(st.find(v[i]) == st.end()) ask(v[i]);
	}
	for(int i = sz / 2; i < sz; ++ i) s2.insert(v[i]);
	for(auto to : s2){
		if(st.find(to) != st.end()) ask(to);
	}
	vector<int> nv1 , nv2 , v1 , v2;
	for(auto to : s2){
		int ls = lst , x = ask(to);
		if(ls == x) {
			v2.push_back(to);
		}
		else{
			nv2.push_back(to);
			ask(to);
		}
	}
	for(auto to : s1) ask(to);
	for(auto to : s1){
		int ls = lst , x = ask(to);
		if(ls == x){
			v1.push_back(to);
		}
		else{
			nv1.push_back(to);
			ask(to);
		}
	}
	//cout << v1.size() << ' ' << v2.size() << '\n';
	vec.push_back({v1 , v2});
	f(nv2) , f(nv1);
}
void ans(vector<int> p , vector<int> q){
	if(p.size() == 0) return ;
	if(p.size() == 1){
		Answer(p[0] , q[0]);
		return ;
	}
	int sz = p.size();
	set<int> s1 , s2;
	vector<int> np1 , nq1 , np2 , nq2;
	for(int i = 0;i < sz / 2; ++ i){
		if(st.find(q[i]) == st.end()) ask(q[i]);
		nq1.push_back(q[i]);
	}
	for(int i = sz / 2; i < sz; ++ i){
		if(st.find(q[i]) != st.end()) ask(q[i]);
		nq2.push_back(q[i]);
	}
	for(int i = 0; i < sz; ++ i){
		int ls = lst , nw = ask(p[i]);
		if(ls == nw) np1.push_back(p[i]);
		else np2.push_back(p[i]);
	}
	//cout << -1;
	ans(np1 , nq1);
	ans(np2 , nq2);
}
void Solve(int N) {
  vector<int> ff;
  for(int i = 1;i <= 2 * N; ++ i) ff.push_back(i);
  for(int i = 0;i < 2 * N; ++ i) swap(ff[i] , ff[rand(2 * N)]);
  f(ff);
  for(auto to : vec){
  	ans(to.fi , to.se);
  }
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...