Submission #1242894

#TimeUsernameProblemLanguageResultExecution timeMemory
1242894PenguinsAreCuteMemory 2 (JOI16_memory2)C++17
100 / 100
0 ms328 KiB
#include "Memory2_lib.h"
#include <bits/stdc++.h>
using namespace std;
mt19937 rng(69);
void solve(vector<int> nos, vector<int> idx) {
	int n = idx.size() / 2;
	if(n == 1) {
		Answer(idx[0], idx[1], nos[0]);
		return;
	}
	int x = rng() % (2 * n - 2);
	int y = rng() % (2 * n - 2);
	int z = rng() % (2 * n - 2);
	if(x > y)
		swap(x, y);
	if(y > z)
		swap(y, z);
	if(x > y)
		swap(x, y);
	y++; z+=2;
	int xy = Flip(idx[x], idx[y]);
	int xz = Flip(idx[x], idx[z]);
	int yz = Flip(idx[y], idx[z]);
	int rnd;
	if(xy == xz)
		rnd = y;
	else
		rnd = x;
	int res[2 * n];
	for(int i=0;i<2*n;i++)
		if(i != rnd)
			res[i] = lower_bound(nos.begin(),nos.end(),Flip(idx[i], idx[rnd]))-nos.begin();
	res[rnd] = -1e9;
	int freq[n];
	memset(freq,0,sizeof(freq));
	for(int i=0;i<2*n;i++)
		if(i!=rnd)
			freq[res[i]]++;
	int mn = 0;
	for(int i=0;i<n;i++)
		if(freq[i] & 1)
			mn = i;
	vector<int> nwno, nwpos;
	int ans[n];
	memset(ans,-1,sizeof(ans));
	for(int i=0;i<2*n;i++) {
		if(i==rnd || res[i]==mn)
			nwpos.push_back(idx[i]);
		else if(ans[res[i]] == -1)
			ans[res[i]] = idx[i];
		else
			Answer(idx[i], ans[res[i]], nos[res[i]]);
	}
	for(int i=0;i<n;i++)
		if(ans[i] == -1)
			nwno.push_back(nos[i]);
	solve(nwno, nwpos);
}
void Solve(int T, int N){
	vector<int> v(2*N), u(N);
	iota(v.begin(),v.end(),0);
	iota(u.begin(),u.end(),0);
	solve(u, v);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...