답안 #410274

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
410274 2021-05-22T11:51:34 Z Blagojce CEOI16_icc (CEOI16_icc) C++11
39 / 100
285 ms 780 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);
		unite(U, V);
	}
}

# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 460 KB Ok! 124 queries used.
2 Correct 9 ms 500 KB Ok! 131 queries used.
# 결과 실행 시간 메모리 Grader output
1 Correct 51 ms 512 KB Ok! 621 queries used.
2 Correct 76 ms 460 KB Ok! 920 queries used.
3 Correct 71 ms 512 KB Ok! 875 queries used.
# 결과 실행 시간 메모리 Grader output
1 Correct 188 ms 548 KB Ok! 1656 queries used.
2 Incorrect 285 ms 556 KB Too many queries! 2289 out of 2250
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 210 ms 508 KB Ok! 1802 queries used.
2 Correct 217 ms 528 KB Ok! 1833 queries used.
3 Correct 228 ms 648 KB Ok! 1938 queries used.
4 Correct 194 ms 520 KB Ok! 1729 queries used.
# 결과 실행 시간 메모리 Grader output
1 Incorrect 243 ms 508 KB Too many queries! 2006 out of 1775
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 247 ms 780 KB Too many queries! 2037 out of 1625
2 Halted 0 ms 0 KB -