正题

题目链接: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. spring boot , spring security 安全的认证

    pom 文件 ------------------------------------------------------------------- <dependencies> < ...

  2. 六:使用Cookie进行会话管理

    1.存储客户端的状态 因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识别客户端的状态.会话技术是帮助服务器 记住客户端状态 2.会话技术 ...

  3. 【SOE】 ArcGIS Server对象扩展(SOE)开发注意事项

    ArcGIS  Server对象扩展(SOE)开发注意事项 1.SOE介绍 在ArcGIS 10.1中ArcGIS Server不在支持DCOM方式的连接,这也就意味着我们不能通过本地方式的连接使用A ...

  4. Spark Core核心----RDD常用算子编程

    1.RDD常用操作2.Transformations算子3.Actions算子4.SparkRDD案例实战 1.Transformations算子(lazy) 含义:create a new data ...

  5. 漫画CAS 的ABA 问题

    链接:https://blog.csdn.net/bjweimengshu/article/details/79000506

  6. 哈希表(HashMap)分析及实现(JAVA)

    转自:http://www.java3z.com/cwbwebhome/article/article8/83560.html?id=4649 探讨Hash表中的一些原理/概念,及根据这些原理/概念, ...

  7. Ubuntu 16.04LTS下eclipse连接mysql

    第一部分:打开eclipse,新建一个web工程,新建一个类db_test.java(jdbc连接mysql的原理自行百度) import java.sql.*; public class db_te ...

  8. ES6扩展——函数扩展之剩余函数

    1.结合扩展运算符 //剩余参数是做聚合的,扩展运算符是做展开的 function sum(...args){ console.log(arguments); console.log(argument ...

  9. T-SQL - 习题02_将数据表year|month|amount查询成year|m1|m2|m3|m4的样式

    时间:2017-09-11 整理:byzqy 题目:有个年度统计表,结构如下: 怎么样把这个表,查询成这样一个结果: 这是在面试过程中遇到的一个关于数据库的题,没有一点思路,不知它考查到的知识点是什么 ...

  10. CentOS 7.3安装Zabbix3.2

    一.ZABBIX概述 Zabbix是一个基于Web界面的分布式系统监控的企业级开源软件.可以监视各种系统与设备的参数,保障服务器及设备的安全运营.   Zabbix的功能和特性: 1.安装与配置简单: ...