传送门


神树可还行

我们令\(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. 简单易用的堡垒机系统—Teleport

    简单易用的堡垒机系统-Teleport 官方文档:http://teleport.eomsoft.net/doc#!1  一.Teleport介绍 Teleport是触维软件推出的一款简单易用的堡垒机 ...

  2. Android Studio 之 注释模板

    我们看有的项目的文档,会发现它的注释写的很好看,很规范. 而如果你的代码注释还是在用简单的 // 或者 /**/  ,那就学习一下在Android Studio中如何进行注释模板的设置 首先看下面代码 ...

  3. Android为TV端助力 转载:内存泄露与内存溢出的区别

    内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory:比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出. ...

  4. 现有项目中集成Flutter

    本文列举了项目开发使用Flutter会遇到的问题,以及如何使用Flutter module在现有项目中集成Flutter,并对其原理进行了分析. 最近在做的一个商业项目,完全的使用Flutter编写的 ...

  5. Html:html是什麽、html文件结构

    相关内容: html是什麽 html文件结构 首发日期:2018-02-12 html是什么: hmtl超文本标记语言,标准通用标记语言下的一个应用. html专门用于网页,它的“标志符”告诉了浏览器 ...

  6. webpack项目轻松混用css module

    前言 本文讲述css-loader开启css模块功能之后,如何与引用的npm包中样式文件不产生冲突. 比如antd-mobilenpm包的引入.在不做特殊处理的前提下,样式文件将会被转译成css mo ...

  7. 漫说996icu黑名单

    以实际行动声援996icu项目. https://github.com/996icu/996.ICU/blob/master/blacklist/blacklist.md 996公司黑名单,京东,华为 ...

  8. kali2016.2(debian)快速安装mysql5.7.17

    糊里糊涂的删除了kali原本的mysql5.6.27版本,原本的mysql与很多软件关联在一起,每次安装都失败,后来把相关的都卸载了(悲催的浪费了一天) 下载地址  debian mysql下载地址 ...

  9. spring mvc 中 controller 路径配置

    下图中,由于红色部分(value="/")的存在,导致 host:port/项目/dimlist 无法被映射到dimList方法,解决办法是将其去掉. package cn.bgo ...

  10. 开发nginx启动脚本及开机自启管理(case)

    往往我们在工作中需要自行写一些脚本来管理服务,一旦服务异常或宕机等问题,脚本无法自行管理,当然我们可以写定时任务或将需要管理的脚本加入自启等方法来避免这种尴尬的事情,case适用与写启动脚本,下面给大 ...