// merge sort 解法 #include using namespace std; bool query(const vector& q) { cout << "? " << q.size() << " "; for(int i = 0; i < q.size(); i++) { cout << q[i] << " \n"[i==q.size()-1]; } cout << flush; string s; cin >> s; return s == "Yes"; } int n; void answer(const vector& ans) { assert(ans.size() == n); cout << "! "; for(int i = 0; i < n; i++) { cout << ans[i] << " \n"[i==n-1]; } cout << flush; } vector merge(const vector& a, const vector& b) { vector merged = b; int now = 0; for(int i = 0; i < a.size(); i++) { while(true) { if(now == merged.size()) { merged.push_back(a[i]); now++; break; } vector q = merged; q.insert(q.begin() + now, a[i]); if(query(q)) { merged.insert(merged.begin() + now, a[i]); now++; break; } else { now++; } } } return merged; } int main() { cin >> n; vector> groups; for(int i = 1; i <= n; i++) { int cnt = 1; for(; cnt <= n; cnt++) { if(!query(vector(cnt, i))) break; } if (cnt == 1) continue; groups.push_back(vector(cnt - 1, i)); } while(groups.size() > 1) { sort(groups.begin(), groups.end(), [](const vector& a, const vector& b) { return a.size() > b.size(); }); vector a = groups.back(); groups.pop_back(); vector b = groups.back(); groups.pop_back(); vector merged = merge(a, b); groups.push_back(merged); } answer(groups[0]); }