답안 #260367

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
260367 2020-08-10T07:23:21 Z 임성재(#5050) 도서관 (JOI18_library) C++17
컴파일 오류
0 ms 0 KB
#include "library.h"
#include<bits/stdc++.h>
using namespace std;

#define fast ios::sync_with_stdio(false); cin.tie(0);
#define fi first
#define se second
#define em emplace
#define eb emplace_back
#define all(v) (v).begin(), (v).end()
#define mp make_pair

static int p[1010];
static vector<int> M;
static vector<int> v[1010];
int n;

static void cl() {
	M.clear();
	M.resize(n, 0);
}

static Find(int a) {
	return p[a] = p[a] == a ? a : Find(p[a]);
}

static void Union(int a, int b) {
	a = Find(a);
	b = Find(b);

	p[b] = a;

	cl();
	M[v[a].back() - 1] = M[v[b].front() - 1] = 1;

	if(Query(M) == 1) {
		for(auto i : v[b]) {
			v[a].eb(i);
		}
		v[b].clear();
		return;
	}

	reverse(all(v[b]));
	cl();
	M[v[a].back() - 1] = M[v[b].front() - 1] = 1;

	if(Query(M) == 1) {
		for(auto i : v[b]) {
			v[a].eb(i);
		}
		v[b].clear();
		return;
	}

	reverse(all(v[a]));
	cl();
	M[v[a].back() - 1] = M[v[b].front() - 1] = 1;

	if(Query(M) == 1) {
		for(auto i : v[b]) {
			v[a].eb(i);
		}
		v[b].clear();
		return;
	}

	reverse(all(v[b]));
	cl();
	M[v[a].back() - 1] = M[v[b].front() - 1] = 1;

	if(Query(M) == 1) {
		for(auto i : v[b]) {
			v[a].eb(i);
		}
		v[b].clear();
		return;
	}
}

void f(int s, int e, int x, int k) {
	//cout << s << " " << e << " " << x << " " << k << endl;
	if(s == e) {
		Union(s, x);

		/*cout << Find(x) << " : ";
		for(auto i : v[Find(x)]) 
			cout << i << " ";

		cout << endl;*/

		return;
	}

	int m = s + e >> 1;

	cl();

	M[x-1] = 1;

	int t = 1;

	for(int i=1; i<=m; i++) {
		if(Find(i) != i) continue;

		t++;

		for(auto j : v[i]) {
			//cout << i << " " << j << endl;
			M[j-1] = 1;
		}
	}

	//cout << "chk" << endl;
	//for(auto i : M) cout << i;
	//cout << endl;

	t -= Query(M);
	//cout << "!" << t << endl;

	if(t) f(s, m, x, t);
	if(k - t) f(m+1, e, x, k-t);
}

void Solve(int N)
{
	cl();
	n = N;
	for(int i=1; i<=N; i++) p[i] = i, v[i].eb(i);

	int sz = 0;
	for(int i=1; i<=N; i++) {
		cl();

		for(int j=1; j<=i; j++) M[j-1] = 1;

		int k = Query(M);

		//cout << i << "-" << k << endl;

		if(k < sz + 1) f(1, i-1, i, sz + 1 - k);
		//else cout << i << " ok" << endl;

		sz = k;
	}

	for(int i=1; i<=N; i++) {
		if(Find(i) == i) {
			Answer(v[i]);
		}
	}
}

Compilation message

library.cpp:23:18: error: ISO C++ forbids declaration of 'Find' with no type [-fpermissive]
 static Find(int a) {
                  ^
library.cpp: In function 'void f(int, int, int, int)':
library.cpp:95:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  int m = s + e >> 1;
          ~~^~~