제출 #1350216

#제출 시각아이디문제언어결과실행 시간메모리
1350216PieArmyMinerals (JOI19_minerals)C++20
80 / 100
18 ms3660 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;
#define mid ((left+right)>>1)
#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 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;
	}
	int cnt=0;
	int bit=0;
	while((1<<bit)<n)bit++;
	bit--;
	for(;bit>=0;bit--){
		for(int i=0;i<n;i++){
			if(state[a[i]]==((i>>bit)&1)){
				query(a[i]);
				cnt++;
			}
		}
		for(int i=0;i<n;i++){
			if(mx[b[i]]<(1<<bit))continue;
			if(query(b[i])){
				cev[b[i]]^=(1<<bit);
				mx[b[i]]^=(1<<bit);
			}
			else{
				mx[b[i]]=(1<<bit)-1;
			}
		}
	}
	//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...