传送门


神树可还行

我们令\(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 构造的更多相关文章

  1. Codeforces 1129 E.Legendary Tree

    Codeforces 1129 E.Legendary Tree 解题思路: 这题好厉害,我来复读一下官方题解,顺便补充几句. 首先,可以通过询问 \(n-1​\) 次 \((S=\{1\},T=\{ ...

  2. HDU 5573 Binary Tree 构造

    Binary Tree 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5573 Description The Old Frog King lives ...

  3. AIM Tech Round 4 (Div. 1) C - Upgrading Tree 构造 + 树的重心

    C - Upgrading Tree 我发现我构造题好弱啊啊啊. 很明显能想到先找到重心, 然后我们的目标就是把所有点接到重心的儿子上,让重心的儿子子树变成菊花图, 这个先把重心到儿子的边连到 i , ...

  4. 2020牛客暑期多校训练营 第二场 C Cover the Tree 构造 贪心

    LINK:Cover the Tree 最受挫的是这道题,以为很简单 当时什么都想不清楚. 先胡了一个树的直径乱搞的贪心 一直过不去.后来意识到这类似于最经典长链剖分优化贪心的做法 然后那个是求最大值 ...

  5. 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/ ...

  6. Codeforces.1129E.Legendary Tree(交互 二分)

    题目链接 \(Description\) 有一棵\(n\)个点的树.你需要在\(11111\)次询问内确定出这棵树的形态.每次询问你给定两个非空且不相交的点集\(S,T\)和一个点\(u\),交互库会 ...

  7. [CF1311E] Construct the Binary Tree - 构造

    Solution 预处理出 \(i\) 个点组成的二叉树的最大答案和最小答案 递归做,由于只需要构造一种方案,我们让左子树大小能小就小,因此每次从小到大枚举左子树的点数并检验,如果检验通过就选定之 现 ...

  8. 2015多校第7场 HDU 5379 Mahjong tree 构造,DFS

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5379 题意:一颗n个节点n-1条边的树,现在要给每个节点标号(1~n),要求:(1)每一层的兄弟节点的 ...

  9. Codeforces 1129E - Legendary Tree(思维题)

    Codeforces 题面传送门 & 洛谷题面传送门 考虑以 \(1\) 为根,记 \(siz_i\) 为 \(i\) 子树的大小,那么可以通过询问 \(S=\{2,3,\cdots,n\}, ...

随机推荐

  1. 19.Odoo产品分析 (二) – 商业板块(11) – 在线活动(1)

    查看Odoo产品分析系列--目录 点击安装"在线活动". 1. 主页 在线活动绑定在电子商务中,在网站中可以看到在线活动的菜单:  在这里可以按时间看到每一个活动. 2. 新建活动 ...

  2. 电脑端支付宝支付 -前端获取支付宝返回的form 以及submit 调用支付扫码页面

    前端调取支付宝支付接口(后台进行封装,没有直接调取支付宝接口),调用返回的数据中,将会有一串的form表单数据返回,我们需要将此表单在当前调用页面submit下,以跳转到支付扫码页: 支付宝返回的fo ...

  3. 应用生命周期终极 DevOps 工具包

    [编者按]本文作者为 Kevin Goldberg,主要介绍了在开发.运营应用的完整生命周期当中,可能用到的 DevOps 工具大集合.文章系 OneAPM 工程师编译整理. DevOps工具包中合适 ...

  4. Spark DataFrame的groupBy vs groupByKey

    在使用Spark SQL的过程中,经常会用到groupBy这个函数进行一些统计工作.但是会发现除了groupBy外,还有一个groupByKey(注意RDD也有一个groupByKey,而这里的gro ...

  5. java----堆区、方法区和栈区

    堆区:只存放类对象,线程共享: 方法区:又叫静态存储区,存放class文件和静态数据,线程共享; 栈区:存放方法局部变量,基本类型变量区.执行环境上下文.操作指令区,线程不共享; class A { ...

  6. python之bytes和string

    转自:https://www.cnblogs.com/skiler/p/6687337.html 1.bytes主要是给在计算机看的,string主要是给人看的 2.中间有个桥梁就是编码规则,现在大趋 ...

  7. perl语言中的.pm文件和.pl文件区别

    perl...呵呵呵 按照惯例,.pm 应该保存 Perl Module,也就是 Perl 模块.例如 Socket.pm.pl 应该保存 Perl Library,也就是 Perl 库文件.例如 p ...

  8. LeetCode算法题-Longest Palindrome(五种解法)

    这是悦乐书的第220次更新,第232篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第87题(顺位题号是409).给定一个由小写或大写字母组成的字符串,找到可以用这些字母构 ...

  9. ABAP 7.50 新特性 – Open SQL中的宿主表达式和其它表达式

    在长期的停滞后,Open SQL的发展终于从沉睡中醒来.从ABAP 7.40开始,SAP推进了某些关键的改变,以尽可能地包含SQL92中的特性,并提供与ABAP CDS中的DDL里面的SELECT一样 ...

  10. Eclipse使用过程中的经验总结

    1.Eclipse中如何配置JDK的Documents和Sources? "Windows"-> "Preferences"-> "Jav ...