답안 #410315

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
410315 2021-05-22T13:54:37 Z Blagojce CEOI16_icc (CEOI16_icc) C++11
90 / 100
194 ms 676 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){
	random_shuffle(all(v));
	for(int i = 0; (1<<i) < (int)v.size(); i ++){
		a.clear();
		b.clear();
		fr(j, 0, (int)v.size()){
			if(j&(1<<i)){
				a.pb(v[j]);
			}
			else{
				b.pb(v[j]);
			}
		}		
		vector<int> ua = unzip(a);
		vector<int> ub = unzip(b);
		if(QUERY(ua, ub)) break;
	}
}

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 7 ms 460 KB Ok! 118 queries used.
2 Correct 7 ms 460 KB Ok! 117 queries used.
# 결과 실행 시간 메모리 Grader output
1 Correct 41 ms 500 KB Ok! 602 queries used.
2 Correct 52 ms 516 KB Ok! 730 queries used.
3 Correct 52 ms 508 KB Ok! 725 queries used.
# 결과 실행 시간 메모리 Grader output
1 Correct 162 ms 524 KB Ok! 1572 queries used.
2 Correct 181 ms 556 KB Ok! 1769 queries used.
3 Correct 165 ms 508 KB Ok! 1641 queries used.
4 Correct 194 ms 560 KB Ok! 1656 queries used.
# 결과 실행 시간 메모리 Grader output
1 Correct 170 ms 520 KB Ok! 1687 queries used.
2 Correct 168 ms 620 KB Ok! 1676 queries used.
3 Correct 174 ms 556 KB Ok! 1751 queries used.
4 Correct 165 ms 512 KB Ok! 1612 queries used.
# 결과 실행 시간 메모리 Grader output
1 Correct 178 ms 596 KB Ok! 1735 queries used.
2 Correct 193 ms 512 KB Ok! 1755 queries used.
3 Correct 194 ms 552 KB Ok! 1741 queries used.
4 Correct 174 ms 628 KB Ok! 1740 queries used.
5 Correct 167 ms 532 KB Ok! 1627 queries used.
6 Correct 170 ms 676 KB Ok! 1695 queries used.
# 결과 실행 시간 메모리 Grader output
1 Incorrect 176 ms 568 KB Too many queries! 1745 out of 1625
2 Halted 0 ms 0 KB -