QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#878815#9734. Identify Chorducup-team5008#RE 0ms1664kbC++202.0kb2025-02-01 17:57:122025-02-01 17:57:14

Judging History

This is the latest submission verdict.

  • [2025-02-01 17:57:14]
  • Judged
  • Verdict: RE
  • Time: 0ms
  • Memory: 1664kb
  • [2025-02-01 17:57:12]
  • Submitted

answer

#include <cstdio>
#include <random>
#include <cassert>

int a, b;

int t, n, Q = 0;

int dist(int a, int b) {
	int d = a - b;
	if (d < 0) d *= -1;
	return std::min(d, n - d);
}

int query(int u, int v) {
	printf("? %d %d\n", u + 1, v + 1);
	++Q;



	/*
	int ans = dist(u, v);
	ans = std::min(ans, dist(u, a) + 1 + dist(b, v));
	ans = std::min(ans, dist(u, b) + 1 + dist(a, v));
	printf("res %d\n", ans);
	return ans;
	*/

	fflush(stdout);
	int re;
	scanf("%d", &re);
	return re;
}

void answer(int u, int v) {
	printf("! %d %d\n", u + 1, v + 1);
	fflush(stdout);
	//return;
	int re;
	scanf("%d", &re);
	assert(re == 1);
}


int z(int x) {
	if (x >= n) x -= n;
	if (x < 0) x += n;
	return x;
}

std::mt19937 rng(324132);
bool iter() {
	int v = rng() % n, vopp = z(v + n / 2);
	int q1 = query(v, vopp);
	if (q1 == dist(v, vopp)) return false;
	int q2 = query(z(v + 1), vopp), k;
	if (q2 == q1 - 1) k = 1;
	else {
		q2 = query(z(v - 1), vopp);
		if (q2 == q1 - 1) k = -1;
		else return false;
	}
	int l = 2, r = n / 2, len = q1 - 1;
	while (l < r) {
		int m = l + r >> 1;
		if (query(z(v + m * k), vopp) == q1 - m) {
			l = m + 1;
			len = q1 - m;
		} else r = m;
	}
	r = z(v + k * (r - 1)); // supposedly a chord node
	//printf("supposedly r %d\n", r + 1);
	//printf("distance %d %d : %d\n", r + 1, vopp + 1, len);
	if (query(z(vopp + 1), r) == len - 1) l = z(vopp + len - 1);
	else l = z(vopp - len + 1);
	if (dist(l, r) != 1 && query(l, r) == 1) {
		answer(l, r);
		assert(l == a && r == b || l == b && r == a);
		assert(Q <= 40);
		return true;
	}
	return false;
}

int main() {
	scanf("%d", &t);
	while (t--) {
		scanf("%d", &n);
		/*
		while (true) {
			a = rng() % n;
			b = rng() % n;
			if (dist(a, b) > 1) break;
		}
		printf("generated %d %d\n", a + 1, b + 1);
		Q = 0;
		*/
		if (n <= 8) {
			bool done = 0;
			for (int i = 0; i < n; ++i) {
				for (int j = i + 2; j < n && !done; ++j) if (dist(i, j) > 1) {
					if (query(i, j) == 1) {
						answer(i, j);
						done = 1;
					}
				}
			}
			assert(done);
		} else {
			while (!iter());
		}
		//printf("used %d queries\n", Q);
	}
}

詳細信息

Test #1:

score: 100
Accepted
time: 0ms
memory: 1664kb

input:

2
6
2
2
2
1
1
4
1
1

output:

? 1 3
? 1 4
? 1 5
? 2 4
! 2 4
? 1 3
! 1 3

result:

ok ok (2 test cases)

Test #2:

score: -100
Runtime Error

input:

1000
15
7
7
5
4
3
4
5
5
1
1
19

output:

? 7 14
? 14 6
? 4 11
? 5 11
? 8 11
? 7 11
? 6 11
? 12 5
? 8 5
! 8 5

result: