[CSAcademy]Find the Tree
[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的更多相关文章
- JOISC2019 游记
JOISC2019 游记 Day 1: 試験 (Examination) 题目大意: 有\(n(n\le10^5)\)个人,每个人有两种属性\(s_i,t_i\).\(q(q\le10^5)\)次询问 ...
- [CSAcademy]Virus on a Tree
[CSAcademy]Virus on a Tree 题目大意: 给你一棵\(n(n\le10^5)\)个点的树,一开始点\(1\)有病毒,可以沿着边扩散.你可以事先切掉若干条边,使得病毒扩散不超过\ ...
- [CSAcademy]Cycle Tree
[CSAcademy]Cycle Tree 题目大意: 定义环树是一张无向连通的简单图,它的生成方式如下: \(2\)个点\(1\)条边的图是环树: 对任意一个环树,加入\(k\)个点\(a_{1\s ...
- [CSAcademy]Connected Tree Subgraphs
题目大意: 给你一棵n个结点的树,求有多少种染色方案,使得染色过程中染过色的结点始终连成一块. 思路: 树形DP. 设f[x]表示先放x时,x的子树中的染色方案数,y为x的子结点. 则f[x]=pro ...
- [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法
二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...
- SAP CRM 树视图(TREE VIEW)
树视图可以用于表示数据的层次. 例如:SAP CRM中的组织结构数据可以表示为树视图. 在SAP CRM Web UI的术语当中,没有像表视图(table view)或者表单视图(form view) ...
- 无限分级和tree结构数据增删改【提供Demo下载】
无限分级 很多时候我们不确定等级关系的层级,这个时候就需要用到无限分级了. 说到无限分级,又要扯到递归调用了.(据说频繁递归是很耗性能的),在此我们需要先设计好表机构,用来存储无限分级的数据.当然,以 ...
- 2000条你应知的WPF小姿势 基础篇<45-50 Visual Tree&Logic Tree 附带两个小工具>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...
- Leetcode 笔记 110 - Balanced Binary Tree
题目链接:Balanced Binary Tree | LeetCode OJ Given a binary tree, determine if it is height-balanced. For ...
随机推荐
- C# 类型转换的开销
先来个测试: static void Main(string[] args) { Stopwatch stopwatch; string strStr = "string"; ob ...
- Swift 之cannot load module 'main' as 'Swift'
如果建立一个Project, 选Command Line程序,语言选Swift, 完成之后会有一个main.swift文件.这个文件用来练算法最好了,因为playground会有各种限制而且bug多多 ...
- C# 泛型单例
不支持非公共的无参构造函数的 public abstract class BaseInstance<T> where T : class,new() { private readonly ...
- VIM编辑器使用
- 微信小程序注意点与快捷键
注意点1. 微信对小程序的要求是整体大小不能超过1MB. 2. .json 是配置文件,其内容必须符合JSON格式,所以文件内部不允许有注释. 3. app.json 是全局配置文件,微信小程序中的每 ...
- Asp.net 项目部署的两个问题
1:关于MVC中BundleCollection压缩js css文件 发布后获取失败的问题 原因是: 默认本地vs里面调试的时候,因为web.config文件里面有一个debug属性,当有此属性时,默 ...
- day 20 - 1 序列化模块,模块的导入
序列化模块 首先我们来看一个序列:'sdfs45sfsgerg4454287789sfsf&*0' 序列 —— 就是字符串序列化 —— 从数据类型 --> 字符串的过程反序列化 —— 从 ...
- 使用python爬虫,批量爬取抖音app视频(requests+Fiddler+appium)
抖音很火,楼主使用python随机爬取抖音视频,并且无水印下载,人家都说天下没有爬不到的数据,so,楼主决定试试水,纯属技术爱好,分享给大家.. 1.楼主首先使用Fiddler4来抓取手机抖音app这 ...
- 013_UDP专项研究监控
数据源: /proc/net/snmp; 采集方式:累计值,每10秒采集一次取差值: 指标:net.snmp.udp (key: system); Out Datagrams: udp层发送的数据包总 ...
- Java虚拟机学习笔记——JVM垃圾回收机制
Java虚拟机学习笔记——JVM垃圾回收机制 Java垃圾回收基于虚拟机的自动内存管理机制,我们不需要为每一个对象进行释放内存,不容易发生内存泄漏和内存溢出问题. 但是自动内存管理机制不是万能药,我们 ...