正题

题目链接:https://www.luogu.com.cn/problem/CF1370F2


题目大意

\(T\)组数据,给出\(n\)个点的一棵树,有两个隐藏的关键点。你每次可以询问一个点集,交互库会回答这个点集中的一个点满足它到两个关键点的距离和最小,和这个距离。

要求在\(11\)次询问内求出这两个关键点。

\(1\leq T\leq 10,1\leq n\leq 1000\)


解题思路

首先第一下不知道干啥就问整张图吧。

这样我们就得到了一个点\(rt\)和距离\(L\)。这个点\(rt\)一定在关键点\(u,v\)的路径上,且\(L\)表示\(u,v\)之间的距离。

然后就好搞了,我们以\(rt\)为根,考虑利用这个\(L\)来搞点操作,我们每次选择一个深度\(dep\)然后询问所有这个深度的点的话,如果得到的距离等于\(L\)就表示这个深度有\(u\sim v\)路径上的点。

也就是我们可以通过二分得到最深的位置,而最深的位置一定是离\(rt\)较远的一个关键点\(u\)。

而我们又知道两个关键点的距离,以\(u\)为根询问一遍深度\(L\)的节点就可以得到\(v\)了。

二分上界是\(min\{L,dep_{max}\}\),所以次数是\(log(n)+2\leq 12\)。好像多了一次?

再挖掘一下性质,发现我们找的是离\(rt\)较远的一个关键点,所以这段距离一定是不小于\(\lfloor\frac{L-1}{2}\rfloor\)的,这样就可以少去一次了


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N=1100;
struct node{
int to,next;
}a[N<<1];
int T,n,tot,ls[N],mx;
vector<int> v[N];char s[10];
void print(int x)
{if(x>9)print(x/10);putchar(48+x%10);return;}
void addl(int x,int y){
a[++tot].to=y;
a[tot].next=ls[x];
ls[x]=tot;return;
}
void dfs(int x,int fa,int dep){
v[dep].push_back(x);mx=max(mx,dep);
for(int i=ls[x];i;i=a[i].next){
int y=a[i].to;
if(y==fa)continue;
dfs(y,x,dep+1);
}
return;
}
int main()
{
scanf("%d",&T);
while(T--){
memset(ls,0,sizeof(ls));tot=mx=0;
for(int i=0;i<=n;i++)v[i].clear();
scanf("%d",&n);
for(int i=1;i<n;i++){
int x,y;
scanf("%d%d",&x,&y);
addl(x,y);addl(y,x);
}
printf("? %d ",n);
for(int i=1;i<=n;i++)
print(i),putchar(' ');
putchar('\n');fflush(stdout);
int rt,L,u,uu;
scanf("%d%d",&rt,&L);
dfs(rt,0,0);u=uu=rt;
int l=(L-1)/2+1,r=min(L,mx);
while(l<=r){
int mid=(l+r)>>1;
printf("? %d ",v[mid].size());
for(int i=0;i<v[mid].size();i++)
print(v[mid][i]),putchar(' ');
putchar('\n');fflush(stdout);
int x,d;scanf("%d%d",&x,&d);
if(d==L)l=mid+1,u=x;
else r=mid-1;
}
v[L].clear();dfs(u,0,0);
printf("? %d ",v[L].size());
for(int i=0;i<v[L].size();i++)
print(v[L][i]),putchar(' ');
putchar('\n');fflush(stdout);
scanf("%d%d",&uu,&L);
printf("! %d %d\n",u,uu);fflush(stdout);
scanf("%s",s+1);
}
}

CF1370F2-The Hidden Pair(Hard Version)【交互题,二分】的更多相关文章

  1. Solution -「CF 1370F2」The Hidden Pair (Hard Version)

    \(\mathcal{Description}\)   Link (hard) & Link (easy).   这是一道交互题.   给定一棵 \(n\) 个结点的树,其中有两个是特殊结点. ...

  2. Codeforces Round #371 (Div. 2) D. Searching Rectangles 交互题 二分

    D. Searching Rectangles 题目连接: http://codeforces.com/contest/714/problem/D Description Filya just lea ...

  3. CF1114E Arithmetic Progression(交互题,二分,随机算法)

    既然是在CF上AC的第一道交互题,而且正是这场比赛让我升紫了,所以十分值得纪念. 题目链接:CF原网 题目大意:交互题. 有一个长度为 $n$ 的序列 $a$,保证它从小到大排序后是个等差数列.你不知 ...

  4. 2010-2011 ACM-ICPC, NEERC, Moscow Subregional Contest Problem K. KMC Attacks 交互题 暴力

    Problem K. KMC Attacks 题目连接: http://codeforces.com/gym/100714 Description Warrant VI is a remote pla ...

  5. Codeforces Round #504 E - Down or Right 交互题

    1023E 题意: 交互题.在一个有障碍地图中,问如何走才能从(1,1)走到(n,n),只能向右或者向左走.每次询问两个点,回复你这两个点能不能走通. 思路: 只用最多2*n-2次询问.从(1,1), ...

  6. D. Game with modulo 交互题(取余(膜)性质)附带a mod b<a/2证明

    D. Game with modulo 交互题(取余(膜)性质) 题意 猜一个点\(a\)可以向机器提问 点对\((x,y)\) 如果\(x\mod(a)>=y\mod(a)\)回答\(x\) ...

  7. 交互题[CF1103B Game with modulo、CF1019B The hat、CF896B Ithea Plays With Chtholly]

    交互题就是程序与电脑代码的交互. 比如没有主函数的程序,而spj则给你一段主函,就变成了一个整体函数. 还有一种就是程序和spj之间有互动,这个用到fflush(stdout);这个函数就可以实现交互 ...

  8. Codeforces 1137D - Cooperative Game - [交互题+思维题]

    题目链接:https://codeforces.com/contest/1137/problem/D 题意: 交互题. 给定如下一个有向图: 现在十个人各有一枚棋子(编号 $0 \sim 9$),在不 ...

  9. Gym - 101375H MaratonIME gets candies 交互题

    交互题介绍:https://loj.ac/problem/6 题意:输出Q X ,读入><= 来猜数,小于50步猜出就算过样例 题解:根本不需要每次输出要打cout.flush()... ...

随机推荐

  1. C++11 shared_ptr(智能指针)详解

    要确保用 new 动态分配的内存空间在程序的各条执行路径都能被释放是一件麻烦的事情.C++ 11 模板库的 <memory> 头文件中定义的智能指针,即 shared _ptr 模板,就是 ...

  2. node后台生成echarts图表

    1 //2,生成图片数据 2 var option = { 3 tooltip: { 4 trigger: 'item', 5 formatter: "{a} <br/>{b} ...

  3. Sublime Text3 显示左侧的目录树

    file->open folder选择一个文件夹,打开一个新窗口把原来的关掉 View->Sise Bar->Hide Side Bar就可以了

  4. mzy,struts学习(一)

    大家都在讲struts已经过时了,现在都是前后台分离,没有必要去学一个淘汰的框架,但是怎么讲呢?我觉得,struts能够流行那么多年,肯定有它的原因,肯定有很多优秀和好的地方,有一个指导过我的人给我讲 ...

  5. 备忘录——C#获取微信小程序的云数据库中数据

    目录 0. 背景说明 0.2 获取AccessToken 0.3 数据库查询 0.4 文件下载 2. 简单的封装 3. 简单测试 4. 参考文档 shanzm-2021年8月17日 17:14:24 ...

  6. 地图控件:overview、scale、toolbar

    地图常用控件: 1.AMap.MapType:地图类型切换插件,用来切换固定的几个常用图层 2.AMap.OverView:地图鹰眼插件,默认在地图右下角显示缩略图 3.AMap.Scale:地图比例 ...

  7. C++、Java、Python、Linux、Go、前端、算法,慕课资料分享

    C++.Java.Python.Linux.Go.前端.算法,慕课资料分享 微信公众号:大道同行JAVA 如有问题或建议,请后台留言,我会尽力解决你的问题. 前言 又见面了.废话不多说,最近多了一些在 ...

  8. 阿里云服务器上部署java项目(安装mysql)

    安装mysql步骤如下: 1.安装MySQL官方的yum repository: wget -i -c http://dev.mysql.com/get/mysql57-community-relea ...

  9. eclipse 将本地插件引用(多种方法)

    eclipse 将本地插件引用(多种方法) 因为工作原因需要使用eclipse,而接触的项目需要一个eclipse的插件才可以进行一些特殊的使用,但是因为年久用的人也少,我解压原先带有插件版本的ecl ...

  10. 自定义Listener

    前言 为什么要自定义Listener? 通过自定义,可以在程序启动过程中监听特定事件,再回调处理逻辑. 自定义SpringApplicationRunListener 1.创建自定义SpringApp ...