Submission #1226180

#TimeUsernameProblemLanguageResultExecution timeMemory
1226180ansoriMinerals (JOI19_minerals)C++20
80 / 100
320 ms7728 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 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> a , b;
  for(int i = 1;i <= 2 * N; ++ i){
	int ls = lst , x = ask(i);
  	if(ls != x) a.push_back(i);
  	else b.push_back(i);
  }
  for(int i = 0;i < a.size(); ++ i){
	swap(a[i] , a[rand(N)]);
	swap(b[i] , b[rand(N)]);
  }
  vec.push_back({a , b});
  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...