제출 #1369311

#제출 시각아이디문제언어결과실행 시간메모리
1369311gohchingjaykMinerals (JOI19_minerals)C++20
100 / 100
31 ms7420 KiB
#include "minerals.h"
#pragma GCC optimize("O3,inline")
#include <bits/stdc++.h>

using namespace std;

using ll = long long;
#define int ll

using ii = pair<int, int>;
using iii = pair<int, ii>;

constexpr int MAXN = 43000;
constexpr int INF = 1e18 + 5;
constexpr int LOG = 20;

int V;
mt19937 rng((uint32_t)chrono::steady_clock::now().time_since_epoch().count());
vector<ii> pairs;
vector<int> state(2 * MAXN + 1);

int Qry(int x) {
	state[x] ^= 1;
	return Query(x);
}

int dnc(int unq, vector<int> v1, vector<int> v2) {
/*
	for (int i : v1) cout << i << ' '; cout << '\n';
	for (int i : v2) cout << i << ' '; cout << '\n';
	for (int i = 1; i <= 2 * V; ++i) cout << state[i] << ' '; cout << '\n';
*/

	int sz = v1.size();
	
	if (sz == 0) {
		return unq;
	}
	
	if (sz == 1) {
		pairs.emplace_back(v1[0], v2[0]);
		return unq;
	}

	shuffle(v1.begin(), v1.end(), rng);
	shuffle(v2.begin(), v2.end(), rng);

	vector<int> v1a; vector<int> v1b; vector<int> v2a; vector<int> v2b;
	
	bool flip = state[v1[0]];
	
	int spl = max(int(sz * 0.38), 1ll);
	for (int i = 0; i < spl; ++i) {
		unq = Qry(v1[i]);
		v1a.emplace_back(v1[i]);
	}
	
	for (int i = spl; i < sz; ++i) v1b.emplace_back(v1[i]);
	
	for (int i = 0; i < sz; ++i) {

		if (v2a.size() == spl) {
			v2b.emplace_back(v2[i]);
			continue;
		}
		if (v2b.size() == sz - spl) {
			v2a.emplace_back(v2[i]);
			continue;
		}

		int curr = Qry(v2[i]);
		if (flip ^ (curr == unq)) {
			v2a.emplace_back(v2[i]);
		}
		else {
			v2b.emplace_back(v2[i]);
		}
		unq = curr;
	}
	
	unq = dnc(unq, v1a, v2a);
	unq = dnc(unq, v1b, v2b);
	return unq;
}

void Solve(signed N) {
	V = N;
	int last = 0;
	vector<int> v1;
	vector<int> v2;
	for (int i = 1; i <= 2 * N; ++i) {
		int curr = Qry(i);
		if (last != curr) {
			v1.emplace_back(i);
		}
		else v2.emplace_back(i);
		
		last = curr;
	}

	dnc(N, v1, v2);
	
	for (auto p : pairs) Answer(p.first, p.second);
}

/*
4
1 5
2 6
3 4
7 8
*/
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…