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\}, ...
随机推荐
- C# 8.0的三个值得关注的新特性
本文翻译自:https://dzone.com/articles/3-new-c-8-features-we-are-excited-about 转载请注明出自:葡萄城官网,葡萄城为开发者提供专业的开 ...
- 章节二、1-java概述-数据类型
一.数据类型 1.基本数据类型 a.数值型 1.整数:byte(1个字节=8位) min:-128 max:127 default:0 .short(2个字节=16位) min:-32768 max: ...
- SQL Server遗失管理权限账号密码怎么办?
假如一个SQL Server实例只允许"SQL身份认证"模式登录数据库,而糟糕的是你忘记了sa的密码(sa出于安全考虑应该被禁用,这里仅仅为了描述问题)或其它具有sysadmin角 ...
- java导出数据到excel里:直接导出和导出数据库数据
一.直接导出 package com.ij34.util; import java.io.FileNotFoundException; import java.io.FileOutputStream; ...
- 如何实现javascript js 类命名空间的写法
转载 猫猫小屋http://www.maomao365.com/?p=823 在C#中有namespace概念,java中有package的概念,有了这些概念之后,在系统的运行时,每一个方法就会拥有唯 ...
- java调用天气预报接口案例
免费天气接口:http://mobile.weather.com.cn/data/sk/城市ID.html 例如: http://mobile.weather.com.cn/data/sk/10124 ...
- 洗礼灵魂,修炼python(86)--全栈项目实战篇(12)—— 利用socket实现文件传输/并发式聊天
由于本篇博文的项目都很简单,所以本次开个特例,本次解析两个项目,但是都很简单的 项目一:用socket实现文件传输 本项目很简单,作为小项目的预热的,前面刚学完socket,这里马上又利用socket ...
- Sql Full-Text Filter
SQL Server 全文索引介绍(转载) 概述 全文引擎使用全文索引中的信息来编译可快速搜索表中的特定词或词组的全文查询.全文索引将有关重要的词及其位置的信息存储在数据库表的一列或多列中.全文索引是 ...
- SQL Server 索引重建手册
注意: 索引重建前建议把数据库切换为完整模式,否则索引复制会在数据文件中进行,导致数据文件很大,而数据文件的收缩比日志文件的收缩要困难的多,且会对业务造成影响. 步骤一: 查询索引碎片,脚本如下,库比 ...
- c/c++ 友元的简单应用
友元的简单应用 1,对象 + 对象,或者,对象 + 数字,可以用类的成员函数去重载+号函数,但是,数字 + 对象就不能用类的成员函数去重载+号函数了, 因为编译器会把数字 + 对象翻译成数字.oper ...