Submission #156824

#TimeUsernameProblemLanguageResultExecution timeMemory
156824popovicirobertMinerals (JOI19_minerals)C++14
40 / 100
31 ms2412 KiB
#include "minerals.h"
#include <bits/stdc++.h>

using namespace std;

void Solve(int n) {
	vector <int> pos, ok(2 * n);
	int ans = 0, i;
	for(i = 0; i < 2 * n; i++) {
		int cur = Query(i + 1);
		if(cur == ans) {
			pos.push_back(i);
			ok[i] = 1;
		}
		ans = cur;
	}
	for(i = 0; i < 2 * n; i++) {
		Query(i + 1);
	}

	vector <int> sol(2 * n), in(2 * n);
	ans = 0;

	for(int bit = 15; bit >= 0; bit--) {
		if((1 << bit) >= n) continue;
		
		for(i = 0; i < n; i++) {
			if(i & (1 << bit)) {
				if(in[i]) continue;
				ans = Query(pos[i] + 1);
				in[i] = 1;
			}
		}
		for(i = 0; i < 2 * n; i++) {
			if(ok[i] == 0) {
				if(Query(i + 1) == ans) {
					sol[i] ^= (1 << bit);
				}
				Query(i + 1);
			}
		}
		if(bit == 0) break;
		for(i = 0; i < n; i++) {
			if(i & (1 << bit)) {
				if(i & (1 << (bit - 1))) continue;
				Query(pos[i] + 1);
				in[i] = 0;
			}
		}
	}
	
	for(i = 0; i < 2 * n; i++) {
		if(ok[i] == 0) {
			//cerr << i + 1 << " " << sol[i] + 1 << "\n";
			Answer(i + 1, pos[sol[i]] + 1);
		}
	}
}
#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...