Submission #523281

#TimeUsernameProblemLanguageResultExecution timeMemory
523281valerikkMinerals (JOI19_minerals)C++17
40 / 100
40 ms3228 KiB
#include "minerals.h"

#include <iostream>
#include <vector>
#include <algorithm>
#include <cassert>

using namespace std;

void Solve(int N) {
	vector<int> a, b;
	int lst = 0;
	for (int i = 1; i <= 2 * N; ++i) {
		int x = Query(i);
		if (x != lst) {
			lst = x;
			a.push_back(i);
		} else {
			Query(i);
			b.push_back(i);
		}
	}
	for (int i : a) {
		lst = Query(i);
	}

	vector<int> l(N, 0), r(N, N);
	for (int it = 0; it < 16; ++it) {
		vector<int> m(N);
		vector<vector<int>> here(N + 1);
		bool ok = true;
		for (int i = 0; i < N; ++i) {
			if (r[i] - l[i] != 1) {
				m[i] = (l[i] + r[i]) / 2;
				here[m[i]].push_back(i);
				ok = false;
			}
		}
		if (ok) break;

		if (it & 1) {
			for (int i = N; i >= 0; --i) {
				for (int j : here[i]) {
					int x = Query(b[j]);
					if (x == lst) {
						r[j] = m[j];
					} else {
						l[j] = m[j];
					}
					lst = x;
				}
				if (i != 0) lst = Query(a[i - 1]);
			}
		} else {
			for (int i = 0; i <= N; ++i) {
				for (int j : here[i]) {
					int x = Query(b[j]);
					if (x == lst) {
						r[j] = m[j];
					} else {
						l[j] = m[j];
					}
					lst = x;
				}
				if (i != N) lst = Query(a[i]);
			}
		}
	}

	for (int i = 0; i < N; ++i) {
		Answer(a[l[i]], 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...