Submission #250111

#TimeUsernameProblemLanguageResultExecution timeMemory
250111oolimryMinerals (JOI19_minerals)C++14
70 / 100
241 ms5876 KiB
#include "minerals.h"
#include <bits/stdc++.h>
using namespace std;

int n;
int cur = 0;
int isbase[90000];
set<int> taken;

bool in(int i){
	return (taken.find(i) != taken.end());
}

int query(int i){
	if(!in(i)) taken.insert(i);
	else taken.erase(i);
	
	cur = Query(i);
	return cur;
}



vector<int> base;
vector<int> other;
int otherVal[90000];

void modifyBase(int bit){
	for(int i = 0;i < n;i++){
		if(i & (1 << bit)){
			if(!in(base[i])) query(base[i]);
		}
		else{
			if(in(base[i])) query(base[i]);
		}
	}
	
	//cout << bit << ": ";
	//for(int x : taken) cout << x << " ";
	//cout << "\n";
}

bool check(int i){
	
	int pre = cur;
	
	int x = other[i];
	
	query(x);
	if(cur == pre) return true;
	else return false;

	return true;
}

void Solve(int N){
	n = N;
	for(int i = 1;i <= 2*n;i++){
		int pre = cur;
		int C = query(i);
		if(pre == C) isbase[i] = 0;
		else isbase[i] = 1;
		
		if(isbase[i]) base.push_back(i);
		else other.push_back(i);
	}
		
	for(int bit = 0;(1 << bit) < n;bit++){
		modifyBase(bit);
		
		for(int i = 0;i < n;i++){
			if(check(i)){
				otherVal[i] += (1 << bit);
			}
		}
	}
	
	for(int i = 0;i < n;i++){
		int B = base[otherVal[i]];
		int O = other[i];
		//cout << B << " " << O << "\n";
		Answer(B, O);
	}
}
#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...