#H1040. find a hidden chain

find a hidden chain

题目描述

这是一道交互题。

给定一棵 nn 点的树,树中有一条隐藏的链 (u,v)(u, v)

你可以向评测机提出若干次询问,每次询问格式应如 k x[1] x[2] ... x[k] 表示询问 x[1],x[2],,x[k]x[1],x[2],\dots,x[k]kk 个点中有多少点在链 (u,v)(u, v) 上。

现在你需要找到这条链,保证 uvu\neq v

注意:你询问的点不能重复

输入格式

第一行一个整数 nn
接着 n1n-1 行,每行两个整数 u,vu,v 表示 u,vu,v 之间存在一条边。

输出格式

每次询问,你需要向标准输出输出 k+1k+1 个数,格式见题面。
在你得出答案之后,你应该输出 ! x y,表示隐藏的链为 (x,y)(x,y),顺序不影响得分。

4
1 2
2 3
1 4

3

2
3 2 3 4

2 3 4

! 3 4

数据规模与约定

limlim 表示交互次数上限。

  • subtask1(15pts): n <= 20, lim = 20 \texttt{subtask1(15pts): n <= 20, lim = 20 }
  • subtask2(10pts): n = 100, lim = 50\texttt{subtask2(10pts): n = 100, lim = 50}
  • subtask3(15pts): n = 1000, lim = 200\texttt{subtask3(15pts): n = 1000, lim = 200}
  • subtask4(19pts): n = 100000, lim = 60\texttt{subtask4(19pts): n = 100000, lim = 60},保证树是一条链。
  • subtask5(11pts): n = 100000, lim = 60\texttt{subtask5(11pts): n = 100000, lim = 60},保证树是菊花图。
  • subtask6(30pts): n = 100000, lim = 60\texttt{subtask6(30pts): n = 100000, lim = 60}

程序模板:

#include <bits/stdc++.h> 
using namespace std;
int query(vector<int> &a) { // 传入你要询问的点,返回在链上的点的个数 
    printf("%d", (int)a.size());
    for (vector<int>::iterator v = a.begin(); v != a.end(); v++) printf(" %d", *v);
    putchar('\n');
    fflush(stdout);
    int d;
    scanf("%d", &d);
    return d;
}
int main() {
    vector<int> a(2);
	a[0]=1; a[1]=2;
    int w=query(a),x=-1,y=-1;
    if (w==2) x=1,y=2;
    printf("! %d %d\n", x, y);
    return 0;
}

$\texttt{idea: Lenstar, std: hydd, checker: Lenstar, data: Lenstar}$