Submission #1212254

#TimeUsernameProblemLanguageResultExecution timeMemory
1212254mychecksedadMemory 2 (JOI16_memory2)C++20
100 / 100
1 ms328 KiB
#include "Memory2_lib.h"
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
#define MOD (1000000000+7)
#define MOD1 (998244353)
#define pb push_back
#define all(x) x.begin(), x.end()
#define en cout << '\n'
#define ff first
#define ss second
#define pii pair<int,int>
#define vi vector<int>
#define cerr if(false) cerr
const int N = 1e6+100, M = 1e5+10, K = 52, MX = 30;

mt19937 rng(234256453);

int rn(int l, int r){
	return uniform_int_distribution<int>(l,r)(rng);
}
void f(vector<int> &V, int val){
	for(int i = 0; i < V.size(); ++i){
		if(V[i] == val){
			V.erase(V.begin() + i);
			break;
		}
	}
}
void Solve(int t, int n){
	vi v;
	for(int i = 1; i <= n*2; ++i){
		v.pb(i-1);
	}
	vector<vi> res(n);
	while(v.size() > 2){
		int m = v.size();
		m--;
		int x = rn(0, m);
		int y = rn(0, m);
		int z = rn(0, m);
		while(x==y) y=rn(0,m);
		while(x==z||y==z) z=rn(0,m);

		int X = Flip(v[x], v[y]);
		int Y = Flip(v[x], v[z]);
		int Z = Flip(v[y], v[z]);
		cerr << v[x] << ' ' << v[y] << ' ' << v[z] << '\n';
		cerr << X << ' ' << Y << ' ' << Z << '\n';
		cerr << '\n';
		if(X == Y && Y == Z){
			// pop out x for now...
			int vx = v[x];
			int vy = v[y];
			int vz = v[z];
			f(v, vx);
			f(v, vy);
			f(v, vz);

			while(v.size()){
				int u = rn(0, int(v.size()) - 1);

				int X = Flip(vy, v[u]);
				int Y = Flip(vy, vz);
				int Z = Flip(v[u], vz);

				if(X == Y && Y == Z){ // we got both minimums here
					res[Y].pb(vy);
					res[Y].pb(vz);
					v.pb(vx);
					break;
				}
				if(X == Y){
					// vy is the minimal one...
					res[Y].pb(vy);
					res[Y].pb(vx);
					v.pb(vz);
					break;
				}else if(X == Z){
					res[Z].pb(v[u]);
					v.erase(v.begin() + u);
				}else{
					// vz is the minimal one...
					res[Y].pb(vz);
					res[Y].pb(vx);
					v.pb(vy);
					break;
				}
			}
			continue;
		}
		if(X == Y){
			cerr << "# " << v[x] << ' ' << X << '\n';
			res[X].pb(v[x]);
			v.erase(v.begin()+x);
		}else if(X == Z){
			cerr << "# " << v[y] << ' ' << Y << '\n';
			res[X].pb(v[y]);
			v.erase(v.begin()+y);
		}else{
			cerr << "# " << v[z] << ' ' << Z << '\n';
			res[Z].pb(v[z]);
			v.erase(v.begin()+z);
		}
	}
	for(int i = 0; i < n; ++i){
		if(res[i].size() == 0){
			res[i].pb(v[0]);
			res[i].pb(v[1]);
			break;
		}
	}
	// for(int pos: v) res[n-1].pb(pos);
	for(int i = 0; i < n; ++i){
		// cerr << res[i][0] << ' ' << res[i][1] << ' ' << i << '\n';
		Answer(res[i][0], res[i][1], i);
	}

	return;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...