Submission #1350422

#TimeUsernameProblemLanguageResultExecution timeMemory
1350422PieArmyMinerals (JOI19_minerals)C++20
100 / 100
21 ms4540 KiB
#include<bits/stdc++.h>
typedef long long ll;
#define pb push_back
#define fr first
#define sc second
#define endl '\n'
using namespace std;
#include "minerals.h"
mt19937 rng(chrono::high_resolution_clock().now().time_since_epoch().count());

int n;
vector<int>a,b;
int tur[86023],mx[86023];
int cev[86023];
int state[86023];
vector<int>v;
int s=0;

int query(int x){
	state[x]^=1;
	int t=Query(x);
	swap(s,t);
	return s!=t;
}

void f(int left,int right,vector<int>c){
	assert(right - left + 1 == c.size());
	if(c.size()==1){
		cev[c[0]]=left;
		return;
	}
	int mid=left+double((right-left)*62)/100;
	for(int i=left;i<=right;i++){
		if(i>mid)query(a[i]);
	}
	int cur=state[a[right]];
	vector<int>aa,bb;
	for(int x:c){
		if(mx[x]<=mid)aa.pb(x);
	}
	for(int x:c){
		if(mx[x]<=mid)continue;
		if(aa.size()==(mid-left+1))bb.pb(x);
		else if(bb.size()==right-mid)aa.pb(x);
		else if(query(x)!=cur)bb.pb(x);
		else aa.pb(x);
	}
	f(left,mid,aa);f(mid+1,right,bb);
}

void Solve(int N) {
	n=N;
	v.resize(2*n);
	iota(v.begin(),v.end(),1);
	shuffle(v.begin(),v.end(),rng);
	for(int i=0;i<2*n;i++){
		if(a.size()==n){
			b.pb(v[i]);
			mx[v[i]]=a.size()-1;
			tur[v[i]]=1;
			continue;
		}
		if(query(v[i])){
			a.pb(v[i]);
			continue;
		}
		b.pb(v[i]);
		tur[v[i]]=1;
		mx[v[i]]=a.size()-1;
	}
	f(0,n-1,b);
	//cerr<<cnt<<endl;
	for(int i=0;i<n;i++){
		Answer(b[i],a[cev[b[i]]]);
	}
}
#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...