제출 #1257924

#제출 시각아이디문제언어결과실행 시간메모리
1257924terracottaliteIsland Hopping (JOI24_island)C++20
2 / 100
2 ms1044 KiB
#include <stdio.h>
#include <vector>
#include <set>
using namespace std;

//#define TEST

#ifndef TEST
#include "island.h"
#endif

#ifdef TEST
int query(int x, int k) {
	printf("? %d %d\n", x, k);
	fflush(stdout);
	int ret;
	scanf("%d", &ret);
	return ret;
}

void answer(int x, int y) {
	printf("! %d %d\n", x, y);
	fflush(stdout);
}
#endif

int parent[400];

int getparent(int v) {
	if (parent[v] == v) return v;
	return parent[v] = getparent(parent[v]);
}

void merge(int x, int y) {
	x = getparent(x);
	y = getparent(y);

	if (x == y) return;

	parent[y] = x;
}

void solve(int n, int l) {
	set<int> unvi;
	for (int i=1;i<=n;i++) {
		unvi.insert(i);
	}

	int d[400];
	for (int i=1;i<=n;i++) d[i] = 0;

	int s[400]; // lol
	for (int i=1;i<=n;i++) s[i] = 0;

	int mat[400][400];
	for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) mat[i][j] = 0;

	for (int i=1;i<=n;i++) parent[i] = i;

	set<int> st;
	
	while (!unvi.empty()) {
		int x = *unvi.begin();
		st.clear();
		while (1) {
			st.insert(x);
			int y = query(x, 1);
			int ult = y;
			d[x]++;
			if (!unvi.count(y)) {
				mat[x][y] = 1;
				mat[y][x] = 1;
				merge(x, y);
				break;
			}
			if (getparent(x) == getparent(y)) {
				int z = query(x, 2);
				d[x]++;

				if (!unvi.count(z)) {
					mat[x][z] = 1;
					mat[z][x] = 1;
					merge(x, z);
					break;
				}

				if (getparent(z) == getparent(x)) {
					s[x] = 1;
					break;
				}

				ult = z;
			}

			mat[x][ult] = 1;
			mat[ult][x] = 1;
			merge(x, ult);

			x = ult;
		}

		for (auto v : st) unvi.erase(v);
	}

	for (int i=1;i<=n;i++) {
		int x = getparent(i);
		if (s[x]) continue;
		int y = -1;
		do {
			y = query(x, ++d[x]);
		} while (getparent(y) != x);

		s[x] = 1;
	}

	/*
	int a[400][2];

	for (int i=1;i<=n;i++) {
		a[i][0] = query(i, 1);
		a[i][1] = query(i, 2);
	}



	for (int i=1;i<=n;i++) {
		mat[i][a[i][0]] = 1;
		mat[a[i][0]][i] = 1;

		if (a[i][1] != a[a[i][0]][1] && a[i][1] != a[a[i][0]][0]) {
			mat[i][a[i][1]] = 1;
			mat[a[i][1]][i] = 1;
		}
	}

	*/
	for (int i=1;i<=n;i++) {
		for (int j=1;j<=n;j++) {
			if (mat[i][j] && i < j) answer(i, j);
		}
	}
}

#ifdef TEST
int main() {
	int n, l;
	scanf("%d %d", &n, &l);
	solve(n, l);
}
#endif
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...