// 去年のCPCTFでこの問題思いついて出してほしかったんだけど!!!わからん!!! #include #include #define all(v) v.begin(), v.end() #define eb emplace_back #define fast cin.tie(nullptr); ios_base::sync_with_stdio(false) using namespace std; using namespace atcoder; using ll = long long; using ull = unsigned long long; constexpr ll mod = 998244353; bool query(vector &b){ int s = b.size(); cout << "? " << s << " "; for(int i=0;i> res; return res == "Yes"; } vector m(vector a, vector b) { if (a.size() > b.size()) { swap(a, b); } int p = a.size(); int q = b.size(); vector c = b; int last = -1; for (int i = 0; i < p; i++) { int l = last + 1; int r = c.size(); int pos = c.size(); while (r - l > 1) { int m = (l + r) / 2; vector t = c; t.insert(t.begin() + m, a[i]); if (query(t)) { pos = m; r = m; } else { l = m; } } c.insert(c.begin() + pos, a[i]); last = pos; } return c; } int n; int main(){ fast; cin >> n; vector cnt(n + 1); int rem = n; for(int i = 1; i <= n; i++){ if(rem == 0) break; vector tmp = {i}; if(!query(tmp)){ cnt[i] = 0; continue; } int l = 1,r = rem + 1; while(r - l > 1){ int m = (l + r) / 2; vector q(m,i); if(query(q)){ l = m; } else{ r = m; } } cnt[i] = l; rem -= l; } vector> ans; for(int i = 1; i <= n; i++){ if(!cnt[i]) continue; vector cur; for(int j = 0; j < cnt[i]; j++){ cur.push_back(i); } ans.push_back(cur); } while(ans.size() >= 2){ sort(all(ans), [&](const vector &a, const vector &b){ return a.size() > b.size(); }); vector a = ans.back(); ans.pop_back(); vector b = ans.back(); ans.pop_back(); auto c = m(a,b); ans.push_back(c); } cout << "! "; for(auto &x : ans[0]){ cout << x << " "; } cout << endl; }