// ちゃんとやってる風だが間違っている方の merge sort の解答例(WA) #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) { vector> new_groups; for (int i = 0; i + 1 < groups.size(); i += 2) { vector merged = merge(groups[i], groups[i + 1]); new_groups.push_back(merged); } if (groups.size() % 2 == 1) { new_groups.push_back(groups.back()); } groups = new_groups; } answer(groups[0]); }