Submission #410272

# Submission time Handle Problem Language Result Execution time Memory
410272 2021-05-22T11:48:39 Z Blagojce ICC (CEOI16_icc) C++11
0 / 100
6 ms 504 KB
#include <bits/stdc++.h>
#define fr(i, n, m) for(int i = (n); i < (m); i ++)
#define st first
#define nd second
#define all(v) begin(v), end(v)
#define pq priority_queue
#define pb push_back

using namespace std;
typedef long long ll;
typedef pair<int,int> pii;

const ll inf = 1e18;
const ll mod = 1e9+7;
const int mxn = 2e2;

mt19937 _rand(time(NULL));

#include "icc.h"



int link[mxn];
int siz[mxn];
int n;

int findx(int x){
	if(x == link[x]) return x;
	link[x] = findx(link[x]);
	return link[x];
}

void unite(int a, int b){
	a = findx(a);
	b = findx(b);
	if(a == b) return;
	
	if(siz[a] < siz[b]) swap(a, b);
	siz[a] += siz[b];
	link[b] = a;
}



vector<int> unzip(vector<int> v){
	fr(i, 0, n){
		if(find(all(v), findx(i)) != v.end()) v.pb(i);
	}
	return v;
}

int QUERY(vector<int> v1, vector<int> v2){
	int N = (int)v1.size();
	int M = (int)v2.size();
	int a1[N];
	fr(i, 0, N) a1[i] = v1[i]+1;
	int a2[M];
	fr(i, 0, M) a2[i] = v2[i]+1;
	return query(N, M, a1, a2);
}


void separation(vector<int> v, vector<int> &a, vector<int> &b){
	vector<int> ua;
	vector<int> ub;
	
	do{
		a.clear();
		b.clear();
		for(auto u : v){
			if(_rand()%2) a.pb(u);
			else b.pb(u);
		}
		
		ua = unzip(a);
		ub = unzip(b);
		
	}while(!QUERY(ua, ub));
}

int findvertex(vector<int> v, vector<int> stat){
	if((int)v.size() == 1){
		return v[0];
	}
	vector<int> lh;
	vector<int> rh;
	fr(i, 0, (int)v.size()/2){
		lh.pb(v[i]);
	}
	fr(i,(int)v.size()/2, (int)v.size()){
		rh.pb(v[i]);
	}
	if(QUERY(lh, stat)){
		return findvertex(lh, stat);
	}
	else{
		return findvertex(rh, stat);
	}
}
void run(int N){
	n = N;
	fr(i, 0, n) link[i] = i, siz[i] = 1;
	fr(i, 0, n-1){
		vector<int> v;
		fr(p, 0, n){
			v.pb(findx(p));
		}
		sort(all(v));
		v.erase(unique(all(v)),v.end());
		
		vector<int> v1;
		vector<int> v2;
		separation(v, v1, v2);
		
		v1 = unzip(v1);
		v2 = unzip(v2);
		
		int U = findvertex(v1, v2);
		int V = findvertex(v2,{U});
		
		setRoad(U+1, V+1);
	}
}

# Verdict Execution time Memory Grader output
1 Incorrect 2 ms 460 KB Wrong road!
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 3 ms 460 KB Wrong road!
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 5 ms 460 KB Wrong road!
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 6 ms 504 KB Wrong road!
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 5 ms 460 KB Wrong road!
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 6 ms 460 KB Wrong road!
2 Halted 0 ms 0 KB -