[CSAcademy]Find the Tree

题目大意:

交互题。

有一棵\(n(n\le2000)\)个结点的树,但是你并不知道树的形态。你可以调用\({\rm query}(x,y,z)\)(其中\(x,y,z\)互不相同)得到与\(x,y,z\)三点距离之和最小的点\(t\)。要求你使用不超过\(25000\)次询问,求出树上的所有边。

保证树的形态随机。

思路:

一开始先随便找两个点\(x,y\),枚举第三个点\(z\),询问\({\rm query}(x,y,z)\),则返回的\(t\)一定是\(x,y\)链上的点,而枚举完所有的\(z\)后,链上的所有点都能被找出来。

对于链上的点\(c_1,c_2\),若\({\rm query}(x,c_1,c_2)=c_1\),则\(c_1\)更靠近\(x\),否则\(c_2\)更靠近\(x\)。这样,我们可以对链上结点排序,从而求出链上的每一条边。

而在上述询问的过程中,我们也可以顺便求出去掉链\(x,y\)后,每个结点\(z\)在哪个子树中。对每一个子树递归进行上述操作即可。

据说可以证明重心落在随机链上的概率\(>\frac12\),因此总的询问次数大约是\(\mathcal O(n\log n)\)的。

源代码:

#include<set>
#include<ctime>
#include<cstdio>
#include<cctype>
#include<vector>
#include<cstdlib>
#include<algorithm>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
const int N=2001;
std::vector<int> v[N];
std::vector<std::pair<int,int>> ans;
inline int query(const int &x,const int &y,const int &z) {
if(x==y) return x;
if(x==z) return x;
if(y==z) return y;
printf("Q %d %d %d\n",x,y,z);
fflush(stdout);
return getint();
}
void solve(const int &x) {
if(v[x].empty()) return;
std::vector<int> u;
u.swap(v[x]);
const int &y=u[rand()%u.size()];
std::set<int> set;
set.insert(x);
set.insert(y);
for(register unsigned i=0;i<u.size();i++) {
const int &z=u[i];
if(z==y) continue;
const int t=query(x,y,z);
set.insert(t);
if(t!=z) v[t].push_back(z);
}
std::vector<int> chain(set.begin(),set.end());
std::sort(chain.begin(),chain.end(),
[x](const int &y,const int &z) {
return query(x,y,z)==y;
}
);
for(register unsigned i=1;i<chain.size();i++) {
ans.emplace_back(chain[i-1],chain[i]);
}
for(int v:chain) solve(v);
}
int main() {
srand(time(NULL));
const int n=getint();
for(register int i=2;i<=n;i++) {
v[1].push_back(i);
}
solve(1);
puts("A");
for(auto e:ans) {
printf("%d %d\n",e.first,e.second);
}
return 0;
}

[CSAcademy]Find the Tree的更多相关文章

  1. JOISC2019 游记

    JOISC2019 游记 Day 1: 試験 (Examination) 题目大意: 有\(n(n\le10^5)\)个人,每个人有两种属性\(s_i,t_i\).\(q(q\le10^5)\)次询问 ...

  2. [CSAcademy]Virus on a Tree

    [CSAcademy]Virus on a Tree 题目大意: 给你一棵\(n(n\le10^5)\)个点的树,一开始点\(1\)有病毒,可以沿着边扩散.你可以事先切掉若干条边,使得病毒扩散不超过\ ...

  3. [CSAcademy]Cycle Tree

    [CSAcademy]Cycle Tree 题目大意: 定义环树是一张无向连通的简单图,它的生成方式如下: \(2\)个点\(1\)条边的图是环树: 对任意一个环树,加入\(k\)个点\(a_{1\s ...

  4. [CSAcademy]Connected Tree Subgraphs

    题目大意: 给你一棵n个结点的树,求有多少种染色方案,使得染色过程中染过色的结点始终连成一块. 思路: 树形DP. 设f[x]表示先放x时,x的子树中的染色方案数,y为x的子结点. 则f[x]=pro ...

  5. [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法

    二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...

  6. SAP CRM 树视图(TREE VIEW)

    树视图可以用于表示数据的层次. 例如:SAP CRM中的组织结构数据可以表示为树视图. 在SAP CRM Web UI的术语当中,没有像表视图(table view)或者表单视图(form view) ...

  7. 无限分级和tree结构数据增删改【提供Demo下载】

    无限分级 很多时候我们不确定等级关系的层级,这个时候就需要用到无限分级了. 说到无限分级,又要扯到递归调用了.(据说频繁递归是很耗性能的),在此我们需要先设计好表机构,用来存储无限分级的数据.当然,以 ...

  8. 2000条你应知的WPF小姿势 基础篇<45-50 Visual Tree&Logic Tree 附带两个小工具>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...

  9. Leetcode 笔记 110 - Balanced Binary Tree

    题目链接:Balanced Binary Tree | LeetCode OJ Given a binary tree, determine if it is height-balanced. For ...

随机推荐

  1. luogu 2157 状压dp

    f[i][j][k]分别代表1-i-1个人全部打完饭时i及其后7个人的状态为j时最后一个打饭的人为i+k的状态下所用的最小时间 当i已经打过饭时 即 j&1 那么 f [i] [j>&g ...

  2. 题解 P4753 【River Jumping】

    这道神奇的模拟题,带一点贪心,其实蛮水的,仔细思考就能ac. 首先我们模拟一下样例2 发现其实答案0 1 2 3也可以,仔细观察题目,我们发现了一句有意思的话:允许输出任意一组答案. 所以就可使用xj ...

  3. Groovy里面闭包中变量符号的查找与变量定义的限制

    class a { def v1 = "v1 in a" static def v2 = "v2 in a" def v4 = "v4 in a&qu ...

  4. 开发一个项目之npm

    npm (nodejs平台上写的js模块的管理工具  下载.互相依赖等) npm install 本地项目的node_modules文件夹  , -g  npm config prefix 目录eg: ...

  5. 移动端,input、textarea滚动至可视区域

    1.一般情况下 在移动端,点击input框之后,会弹出输入键盘.而内容input的内容也会自动滚动到可视区域内. 2.当父元素设置了overflow属性之后 在设置了overflow属性之后,点击in ...

  6. Spring中@Component注解,@Controller注解详解

    在使用Spring的过程中,为了避免大量使用Bean注入的Xml配置文件,我们会采用Spring提供的自动扫描注入的方式,只需要添加几行自动注入的的配置,便可以完成 Service层,Controll ...

  7. Robot Framework学习笔记

    robot framework 上个用例的输出作为下个用例的输入 (Set Global Variable的用法) 注意:如果直接在suite里定义变量,变量在suite里的用例里只能应用,修改的效果 ...

  8. django ajax 及批量插入数据 分页器

    ``` Ajax 前端朝后端发送请求都有哪些方式 a标签href GET请求 浏览器输入url GET请求 form表单 GET/POST请求 Ajax GET/POST请求 前端朝后端发送数据的编码 ...

  9. 学习笔记_J2EE_SpringMVC_02_注解配置

    SpringMVC注解配置 1.测试环境: 名称 版本 备注 操作系统 Windows10 专业版1809X64   WEB服务器 Tomcat 8.5 X64   浏览器 Google Chrome ...

  10. PADS Layout VX.2.3 制作PCB封装(Decal)时,导入DXF文件

    操作系统:Windows 10 x64 工具1:PADS Layout VX.2.3 进入PCB封装编辑器(Decal Editor),点击Drafting Toolbar > Import D ...