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\}, ... 
随机推荐
- iOS ---------NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)
			遇到此问题的解决办法: 使用<NSURLSessionDelegate>中的didReceiveChallenge方法,方法中的代码如下: - (void)URLSession:(NSUR ... 
- iOS------自动查找项目中不用的图片资源
			注意:删除的时候要谨慎!别什么图都删了,看看对项目有没有作用.这个插件有时也会有一定的误差. 具体操作步骤: 1.去github上下载LSUnusedResources(下载地址:https://gi ... 
- 利用SurfaceView显示正弦曲线,仿造示波器
			众所周知,view是通过刷新来重绘视图的,Android系统通过发出VSYNC信号来进行屏幕重绘,刷新的时间间隔为16ms,如果在16ms内view完成你所需要的所有操作,那么用户在视觉上就不会产生卡 ... 
- 性能测试 基于Python结合InfluxDB及Grafana图表实时采集Linux多主机或Docker容器性能数据
			基于Python结合InfluxDB及Grafana图表实时采集Linux多主机性能数据 by:授客 QQ:1033553122 实现功能 1 测试环境 1 环境搭建 3 使用前提 3 使用方法 ... 
- Git 结合Git使用Bitbucket进行代码版本管理流程规范与实践
			结合Git使用Bitbucket进行代码版本管理流程规范与实践 By:授客 QQ:1033553122 目录 目录 1 一. 测试环境 2 二. 新建项目 2 三. 新建公有版本库 3 四. ... 
- vue 构建项目 文件引入
			1.vue引用依赖文件. 举例:axios 先安装 axios.如果直接安装 vue-axios 会报错 npm install axios npm install --save axios vue ... 
- Docker & pure-ftpd 快速加建 FTP 服务器
			项目需要进行升级服务,现在需要基于centos 7使用docker来快速打架一个FTP环境来方便本地文件上传. 本次使用的是 pure-ftpd docker镜像,有关镜像使用的详细信息,本人是从 h ... 
- django 下载文件
			方法一. from django.http import StreamingHttpResponse def big_file_download(request): # do something... ... 
- MYSQL主从同步/主主同步
			一.MYSQL主从同步 注意:进行主从同步操作时需要确保DB无写操作 flush tables with read lock: //全局读锁定,执行了命令之后所有库所有表都被锁定只读. 1.在主机 ... 
- Python比较(关系)运算符
			比较(关系)运算符 运 算 符 作 用 举 例 结 果 > 大于 'a'>'b' False < 小于 156<456 True == 等于 'c' ... 
