本地手造了几组样例没问题。
#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;
}