QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#883308#9734. Identify ChordK8HeWA 1ms3584kbC++142.2kb2025-02-05 15:45:432025-02-05 15:45:45

Judging History

This is the latest submission verdict.

  • [2025-02-05 15:45:45]
  • Judged
  • Verdict: WA
  • Time: 1ms
  • Memory: 3584kb
  • [2025-02-05 15:45:43]
  • Submitted

answer

#include <bits/stdc++.h>
#define _for(i, a, b) for (int i = a; i <= b; ++i)
#define for_(i, a, b) for (int i = a; i >= b; --i)
#define far(i, vec) for (auto i : vec)
#define bdmd int mid = (l + r) >> 1
typedef long double ldb;
typedef long long ll;
typedef double db;
typedef std::pair <int, int> pii;
typedef std::pair <ll, ll> pll;
const int N = 1e5 + 10, P = 998244353;
namespace IO {
	int rnt () {
		int x = 0, w = 1; char c = getchar ();
		while (!isdigit (c)) { if (c == '-') w = -1; c = getchar (); }
		while (isdigit (c)) x = (x << 3) + (x << 1) + (c ^ 48), c = getchar ();
		return x * w;
	}
} // namespace IO
namespace SOLVE {
	using namespace IO;
	int n, a[N], ans;
	int Que (int u, int v) {
		std::cout << "? " << u + 1 << " " << v + 1 << std::endl;
		int dist; std::cin >> dist;
		return dist;
	}
	void Ans (int u, int v) {
		std::cout << "! " << u + 1 << " " << v + 1 << std::endl;
		int corr; std::cin >> corr;
		return;
	}
	int Dis (int u, int v) {
		int d = std::abs (u - v);
		return std::min (d, n - d);
	}
	void Main () {
		std::cin >> n;
		int S = 0, T = n / 2, D = Que (S, T);
		while (Dis (S, T) == D) {
			if (!(n & 1))
				++S, ++T;
			else {
				if (T - S == n / 2)
					++T;
				else
					++S;
			}
			S %= n, T %= n, D = Que (S, T);
		}
		int p = (T + n - 1) % n, pd = Que (S, p);
		int q = (T + 1) % n, qd = Que (S, q);
		if (pd != Dis (S, p) && pd < D) {
			int L = S, R = p;
			while (L <= R) {
				int mid = (L + R) / 2;
				if (T - mid == D - Que (S, mid))
					R = mid - 1;
				else
					L = mid + 1;
			}
			D -= T - L + 1;
			Ans (S + D, L);
		}
		else if (qd != Dis (S, q) && qd < D) {
			int L = q, R = S + n;
			while (L <= R) {
				int mid = (L + R) / 2;
				if (mid - T == D - Que (S, mid % n))
					L = mid + 1;
				else
					R = mid - 1;
			}
			D -= R - T + 1;
			Ans ((S + n - D) % n, R % n);
		}
		else {
			--D;
			if (D == 0)
				Ans (S, T);
			else if (Que (S + D, T) == 1 && Dis (S + D, T) != 1)
				Ans (S + D, T);
			else
				Ans ((S + n - D)%n, T);
		}
		return;
	}
}
int main () {
	std::ios::sync_with_stdio (false);
	std::cin.tie (0), std::cout.tie (0);
	int T;
	std::cin >> T;
	while (T--)
		SOLVE::Main ();
	return 0;
} /*

*/

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

input:

2
6
2
2
2
1
1
4
1
1
1
1

output:

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

result:

ok ok (2 test cases)

Test #2:

score: -100
Wrong Answer
time: 1ms
memory: 3456kb

input:

1000
15
5
6
6
1
1
19
5
6
4
5
3
4
-1

output:

? 1 8
? 1 7
? 1 9
? 5 8
! 5 8
? 1 10
? 1 9
? 1 11
? 1 15
? 1 12
? 1 13
! 18 12

result:

wrong answer Wrong answer n=19, actual=3-12, guessed=18-12 (test case 2)