CF1129E Legendary Tree 构造
神树可还行
我们令\(1\)为树根,那么如果要询问\(x\)是否在\(y\)子树中,就令\(S = \{1\} , T = \{x\} , u = y\),询问一下就可以知道了。
那么考虑先构造出一个这样的序列\(a_i\):对于树上的每一个节点\(u\),它的父亲在这个序列上的位置在它的前面。
考虑增量构造。假如说我们已经构造出了\(1\)到\(i\)的序列,现在要把\(i+1\)插入。有一种显然正确的构造方法:在序列上二分,找到一个最大的位置\(p\)满足\(S = \{1\} , T = \{a_1,a_2,...,a_p\} , u = i+1\)时询问答案为\(0\),将这个数放在\(a_p\)之后即可。
接下来我们可以找边了。对于每一个点,我们找它的所有儿子,而它的儿子一定在序列的后面的位置。于是在\(a_i\)上从右往左扫,用一个vector维护当前未找到父亲的点的集合\(P\)。对于点\(i\),先询问\(S = \{1\} , T = P , u = a_i\)时是否存在答案,如果不存在直接退出,否则二分出在\(P\)中最靠前的儿子\(P_j\),连上边\((i,P_j)\),然后再对于\(P' = \{P_{j+1},P_{j+2},...,P_{|P|}\}\)做这样的操作就可以了。
复杂度:构造序列需要\(nlogn\)、每一个儿子被找到需要\(nlogn\)、每一个点失败的询问总共\(n\)次,加起来\(2nlogn+n\)可以通过本题。
#include<iostream>
#include<cstdio>
#include<vector>
//This code is written by Itst
using namespace std;
#define PII pair < int , int >
int N;
vector < PII > Edge;
vector < int > S , T , arr , son;
bool query(int u){
cout << S.size() << endl;
for(auto t : S) cout << t << ' ';
cout << endl << T.size() << endl;
for(auto t : T) cout << t << ' ';
cout << endl << u << endl;
int x; cin >> x; return x;
}
void answer(){
cout << "ANSWER" << endl;
for(auto t : Edge) cout << t.first << ' ' << t.second << endl;
}
int main(){
ios::sync_with_stdio(0);
cin >> N;
S.push_back(1); arr.push_back(2);
for(int i = 3 ; i <= N ; ++i){
int L = 0 , R = i - 2;
while(L < R){
int mid = (L + R + 1) >> 1;
T.clear(); T.insert(T.begin() , arr.begin() , arr.begin() + mid);
query(i) ? R = mid - 1 : L = mid;
}
arr.insert(arr.begin() + L , i);
}
son.push_back(*--arr.end());
auto it = --arr.end();
while(it-- != arr.begin()){
auto t = son.begin();
while(t != son.end()){
T.clear(); T.insert(T.begin() , t , son.end());
if(!query(*it)) break;
int L = 0 , R = son.end() - t - 1;
while(L < R){
int mid = (L + R) >> 1;
T.clear(); T.insert(T.begin() , t , t + mid + 1);
query(*it) ? R = mid : L = mid + 1;
}
while(L){++t; --L;}
auto t1 = t; Edge.push_back(PII(*it , *t)); son.erase(t1);
}
son.push_back(*it);
}
for(auto t : son) Edge.push_back(PII(t , 1));
answer();
return 0;
}
CF1129E Legendary Tree 构造的更多相关文章
- Codeforces 1129 E.Legendary Tree
Codeforces 1129 E.Legendary Tree 解题思路: 这题好厉害,我来复读一下官方题解,顺便补充几句. 首先,可以通过询问 \(n-1\) 次 \((S=\{1\},T=\{ ...
- HDU 5573 Binary Tree 构造
Binary Tree 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5573 Description The Old Frog King lives ...
- AIM Tech Round 4 (Div. 1) C - Upgrading Tree 构造 + 树的重心
C - Upgrading Tree 我发现我构造题好弱啊啊啊. 很明显能想到先找到重心, 然后我们的目标就是把所有点接到重心的儿子上,让重心的儿子子树变成菊花图, 这个先把重心到儿子的边连到 i , ...
- 2020牛客暑期多校训练营 第二场 C Cover the Tree 构造 贪心
LINK:Cover the Tree 最受挫的是这道题,以为很简单 当时什么都想不清楚. 先胡了一个树的直径乱搞的贪心 一直过不去.后来意识到这类似于最经典长链剖分优化贪心的做法 然后那个是求最大值 ...
- Codeforces Round #319 (Div. 1) B. Invariance of Tree 构造
B. Invariance of Tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/576/ ...
- Codeforces.1129E.Legendary Tree(交互 二分)
题目链接 \(Description\) 有一棵\(n\)个点的树.你需要在\(11111\)次询问内确定出这棵树的形态.每次询问你给定两个非空且不相交的点集\(S,T\)和一个点\(u\),交互库会 ...
- [CF1311E] Construct the Binary Tree - 构造
Solution 预处理出 \(i\) 个点组成的二叉树的最大答案和最小答案 递归做,由于只需要构造一种方案,我们让左子树大小能小就小,因此每次从小到大枚举左子树的点数并检验,如果检验通过就选定之 现 ...
- 2015多校第7场 HDU 5379 Mahjong tree 构造,DFS
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5379 题意:一颗n个节点n-1条边的树,现在要给每个节点标号(1~n),要求:(1)每一层的兄弟节点的 ...
- Codeforces 1129E - Legendary Tree(思维题)
Codeforces 题面传送门 & 洛谷题面传送门 考虑以 \(1\) 为根,记 \(siz_i\) 为 \(i\) 子树的大小,那么可以通过询问 \(S=\{2,3,\cdots,n\}, ...
随机推荐
- Javascript 流程控制
流程控制 JavaScript通过流程语句来执行程序流,程序流有若干语句组成.在正常情况下,程序中 的语句时按照书写顺序执行的,这种结构称为顺序结构.除了顺序结构之外还有选择结构和循环结构. 1.选择 ...
- 初步了解redux
redux作为react的状态状态管理工具,是十分重要的一部分,但是它在学习起来比较困难.它的写法一共分为三部分,而且他不像其他的东西一样可以写一步,在页面上查看一下.它必须三个部分全部完成之后,才能 ...
- Linux 进程后台运行的几种方式 screen
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/80580779 本文出自[赵彦军的博客] screen是Linux窗口管理器,用户可 ...
- video 标签在微信浏览器的问题解决方法
最近做的些web页面,内嵌许多小视频,在ios和安卓手机上播放时,遇到不少问题: 在微信浏览器内播放时,视频会自动全屏 如果每个视频都有一张自定义的图片作为封面,在显示视频的同时,如果没有给这个视频设 ...
- android adb 流程原理代码分析(一)
由于要用到adb的知识,但是对adb啥也不了解,看了下android的代码,adb的源码在system/core/adb下面,然后网上搜下了资料,发现很多大神的源码分析,瞬间信心爆棚,把大神写的博客都 ...
- JHipster生成微服务架构的应用栈(二)- 认证微服务示例
本系列文章演示如何用JHipster生成一个微服务架构风格的应用栈. 环境需求:安装好JHipster开发环境的CentOS 7.4(参考这里) 应用栈名称:appstack 认证微服务: uaa 业 ...
- C# WINFORM 应用程序动态读写xml config文件,获取数
在实际项目里,我们需要用一个应用程序去连接多个数据库,有的进行测试,有的是数据库基本结构相同,数据不同, 我们不可能总去程序的连接字符串里去修改,更不能让用户去修改,所以需要动态去修改连接数据库配置信 ...
- 谁记录了mysql error log中的超长信息
[问题] 最近查看MySQL的error log文件时,发现有很多服务器的文件中有大量的如下日志,内容很长(大小在200K左右),从记录的内容看,并没有明显的异常信息. 有一台测试服务器也有类似的问题 ...
- c/c++ 智能指针 shared_ptr 和 new结合使用
智能指针 shared_ptr 和 new结合使用 用make_shared函数初始化shared_ptr是最推荐的,但有的时候还是需要用new关键字来初始化shared_ptr. 一,先来个表格,唠 ...
- 关于Numba开源库(Python语法代码加速处理,看过一个例子,速度可提高6倍)
关于Numba你可能不了解的七个方面 https://yq.aliyun.com/articles/222523 Python GPU加速 (很详细,有代码练习)https://blog.csdn.n ...