Submission #919490

#TimeUsernameProblemLanguageResultExecution timeMemory
919490NK_Mađioničar (COI22_madionicar)C++17
13 / 100
961 ms860 KiB
// Success consists of going from failure to failure without loss of enthusiasm
#include <bits/stdc++.h>

using namespace std;

#define nl '\n'

template<class T> using V = vector<T>;
using vi = V<int>;

int main() {
	cin.tie(0)->sync_with_stdio(0);
	
	int N; cin >> N;

	auto ask = [&](int l, int r) {
		if (l < 0 || r >= N) return 0;
		cout << "? " << l + 1 << " " << r + 1 << endl;
		int res; cin >> res; return res;
	};

	int ANS = 1;

	// odd
	{
		vi ans(N); int lo = 0, hi = 0;
		for(int i = 0; i < N; i++) {
			if (i > 0) {
				ans[i] = min(hi - i, ans[hi - i + lo]);
				ans[i] = max(0, ans[i]);
			}
			while(ask(i - ans[i] - 1, i + ans[i] + 1)) ++ans[i];
			if (ans[i] + i > hi) lo = i - ans[i], hi = i + ans[i];
		}

		// for(auto& x : ans) cout << x << " ";
		// cout << nl;

		int bst = *max_element(begin(ans), end(ans));
		ANS = max(ANS, 2 * bst + 1);
	}

	// even
	{
		vi ans(N, -1); int lo = 0, hi = 0;
		for(int i = 1; i < N; i++) {
			// cout << lo << " " << hi << " " << hi - i + 1 + lo << endl;
			if (i > 1) ans[i] = min(hi - i + 1, ans[hi - i + 1 + lo]);
			// cout << ans[i] << endl;

			while(ask(i - 1 - ans[i] - 1, i + ans[i] + 1)) ++ans[i];
			if (ans[i] + i > hi) lo = i - 1 - ans[i], hi = i + ans[i];
		}

		// for(auto& x : ans) cout << x << " ";
		// cout << nl;

		int bst = *max_element(begin(ans), end(ans));
		ANS = max(ANS, 2 * bst + 2);
	}

	cout << "! " << ANS << endl;



	exit(0-0);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...