本地 AC,提交 Idleness Limit Exceeded
查看原帖
本地 AC,提交 Idleness Limit Exceeded
758679
phoenixzhan楼主2023/3/6 20:42

本地手造了几组样例没问题。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define fi first
#define se second
#define mp make_pair
#define pii pair<int, int>
int n, k; 
int q1(int x, int y) {
	cout << "? 1 1" << endl;
	cout << x << endl << y << endl;
	char s[14];
	cin >> s;
	return s[0] == 'F' ? 1 : (s[0] == 'S' ? -1 : 0);
}
int q(vector<int> x, vector<int> y) {
	sort(y.begin(), y.end());
	if (y.size() < x.size()) return -1;
	cout << "? " << x.size() << " " << x.size() << endl;
	for (int i = 0; i < x.size(); i++) cout << x[i] << " ";
	cout << endl;
	for (int i = 0; i < x.size(); i++) cout << y[i] << " ";
	cout << endl;
	char s[14];
	cin >> s;
	return s[0] == 'F' ? 1 : (s[0] == 'S' ? -1 : 0);
}
mt19937 rnd(54423535);
signed main() {
//	srand((unsigned)time(0));
	int T;
	cin >> T;
	while (T--) {
		cin >> n >> k;
		if (n == 2) {
			if (q1(1, 2) == 1) cout << "! 2" << endl; else cout << "! 1" << endl; continue;
		} 
		int p = 2;
//		// upd
		for (int _ = 1; _ <= 25; _++) {
			int x = rnd() % (n - 1) + 2;
			while (p == x) {
				x = rnd() % (n - 1) + 2;
			}
			if (!p) p = x;
			else {
				if (q1(x, p) >= 1) p = x;
			}
		}
		vector<int> pos; pos.clear();
		pos.pb(p);
		int now = 0;
		for (int i = 0; i <= 11; i++) {
			if ((1ll << i) <= n) {
				vector<int> qu; qu.clear();
				for (int j = (i == 0 ? 1 : (1ll << (i - 1)) + 1); j <= (1ll << i); j++) {
					qu.pb(j);
				}
				if (q(qu, pos) == 0) {
					now = (1ll << i);
					for (int j = 0; j < qu.size(); j++) pos.pb(qu[j]);
				} else break;
			}
		}
		for (int i = 11; i >= 0; i--) {
			if ((1ll << i) + now <= n) {
				vector<int> qu; qu.clear();
				for (int j = now + 1; j <= now + (1ll << i); j++) qu.pb(j);
				if (q(qu, pos) == 0) {
					now += (1ll << i);
				}
			}
		}
		cout << "! " << now + 1 << endl;
	}
	return 0;
}
2023/3/6 20:42
加载中...