正题

题目链接: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. .Net Core WebApi(二)

    查看当前端口暴露的所有接口信息 https://localhost:5001/.well-known/openid-configuration 拿到信息如下

  2. C#基础知识---?为何物

    一. 可空类型修饰符(?)引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; 是正确的,int i=null; 编译器就会报错.可空类型的出现, ...

  3. C# wpf中DataGrid 支持汇总行

    最近有一个需求,需要汇总金额,份额等字段.我们使用的是原生的WPF控件,自己开发了一套Template.而没有使用比较成熟的第三方控件.所以这个功能得自己开发.并且要做成控件层次的功能. 当然也可以这 ...

  4. 1 TortoiseGit简介

    tortoiseGit是一个开放的git版本控制系统的源客户端,支持Winxp/vista/win7.该软件功能和git一样 不同的是:git是命令行操作模式,tortoiseGit界面化操作模式,不 ...

  5. QT 资源文件的添加

  6. SpringBoot配置Cors跨域请求

    一.同源策略简介 同源策略[same origin policy]是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源. 同源策略是浏览器安全的基石. 什么是源 源[or ...

  7. 在localStorage中存储对象数组并读取

    频繁ajax请求导致页面响应变慢. 于是考虑将数据存储在window.storage中,这样只请求一次ajax,而不需要频繁请求. 鉴于localstorage中只能存储字符串,所以我们要借助于JSO ...

  8. PipedInputStream and PipedOutputStream example

    必须要有PipedInputStream ,PipedOutputStream 在不同线程,不然死锁 Java.io.PipedOutputStream and java.io.PipedInputS ...

  9. 聊聊 PC 端自动化最佳方案 - Pywinauto

    1. 前言 大家好,我是安果! 上一篇文章,聊到 PC 端的一种自动化方案:WinAppDriver 聊聊 PC 端自动化最佳方案 - WinAppDriver 有小伙伴后台给我留言,说「 pywin ...

  10. 基于Nginx实现负载均衡的部署

    Nginx(enginex)是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器. nginx官方网站:http://nginx.org/ nginx plus收费软件, ...