Codeforces 1129E - Legendary Tree(思维题)
考虑以 \(1\) 为根,记 \(siz_i\) 为 \(i\) 子树的大小,那么可以通过询问 \(S=\{2,3,\cdots,n\},T=\{1\}\) 以及每个 \(u\) 得出 \(siz_u\) 的值。
考虑将所有点按 \(siz\) 从小到大排序并维护一个集合 \(st\) 表示目前还没有找到父亲的点的集合,那么我们枚举到一个点 \(x\) 时就在 \(st\) 中二分找到所有父亲为 \(x\) 的点并将它们从 \(st\) 中删除,具体步骤是,我们先二分找出 \(st\) 中编号最小的点,即二分出一个 \(mid\) 后就询问 \(S=st\) 中编号最小的 \(mid\) 个点组成的集合,\(T=\{1\}\),\(u=x\),如果交互库返回的值 \(>0\) 就向左二分,否则向右二分,二分出第一个后再找第二个、第三个……以此类推。删完这些点之后加入将 \(x\) 加入集合,如此进行下去即可。最后扫描到 \(1\) 时就将 \(st\) 中的点的父亲全部设为 \(1\) 并清空 \(st\)
时间复杂度 \(n\log^2n\),询问次数 \(n\log n\),实测在 \(7000\) 左右,可以通过此题的限制。
看到没?什么超纲的算法都没有。所以啊,菜是原罪/kk——Codeforces Round #691 (Div.2) 题解
const int MAXN=500;
int n,siz[MAXN+5],ord[MAXN+5];set<int> st;
bool cmp(int x,int y){return siz[x]<siz[y];}
bool check(int x,int l,int r){
	set<int>::iterator it=st.begin();
	for(int i=1;i<l;i++) ++it;printf("%d\n",r-l+1);
	for(int i=1;i<=r-l+1;i++) printf("%d%c",*it++," \n"[i==r-l+1]);
	printf("1\n1\n%d\n",x);fflush(stdout);
	int t;scanf("%d",&t);return t>0;
}
int main(){
	scanf("%d",&n);siz[1]=n;
	for(int i=2;i<=n;i++){
		printf("%d\n",n-1);
		for(int j=2;j<=n;j++) printf("%d%c",j," \n"[j==n]);
		printf("1\n1\n%d\n",i);fflush(stdout);
		scanf("%d",&siz[i]);
	} for(int i=1;i<=n;i++) ord[i]=i;sort(ord+1,ord+n+1,cmp);
	vector<pii> ans;
	for(int i=1;i<n;i++){
		if(!st.empty()){
			int cur=0;vector<int> son;
			while(cur<st.size()){
				int l=cur+1,r=st.size(),p=st.size()+1;
				while(l<=r){
					int mid=l+r>>1;
					if(check(ord[i],cur+1,mid)) p=mid,r=mid-1;
					else l=mid+1;
				} if(p!=st.size()+1){
					set<int>::iterator it=st.begin();
					for(int j=1;j<p;j++) ++it;
					son.pb(*it);
				} cur=p;
			} for(int x:son) st.erase(st.find(x)),ans.pb(mp(x,ord[i]));
		} st.insert(ord[i]);
	} printf("ANSWER\n");
	for(int x:st) ans.pb(mp(x,1));
	for(pii p:ans) printf("%d %d\n",p.fi,p.se);
	fflush(stdout);
	return 0;
}
												
											Codeforces 1129E - Legendary Tree(思维题)的更多相关文章
- Codeforces.1129E.Legendary Tree(交互 二分)
		
题目链接 \(Description\) 有一棵\(n\)个点的树.你需要在\(11111\)次询问内确定出这棵树的形态.每次询问你给定两个非空且不相交的点集\(S,T\)和一个点\(u\),交互库会 ...
 - CF--思维练习-- CodeForces - 215C - Crosses(思维题)
		
ACM思维题训练集合 There is a board with a grid consisting of n rows and m columns, the rows are numbered fr ...
 - Codeforces 675C Money Transfers 思维题
		
原题:http://codeforces.com/contest/675/problem/C 让我们用数组a保存每个银行的余额,因为所有余额的和加起来一定为0,所以我们能把整个数组a划分为几个区间,每 ...
 - Codeforces 1090D - Similar Arrays - [思维题][构造题][2018-2019 Russia Open High School Programming Contest Problem D]
		
题目链接:https://codeforces.com/contest/1090/problem/D Vasya had an array of n integers, each element of ...
 - CodeForce - 1189 D1. Add on a Tree (思维题)
		
Note that this is the first problem of the two similar problems. You can hack this problem only if y ...
 - codeforces 1140D(区间dp/思维题)
		
D. Minimum Triangulation time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
 - Codeforces 957 水位标记思维题
		
A #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #def ...
 - ACM思维题训练 Section A
		
题目地址: 选题为入门的Codeforce div2/div1的C题和D题. 题解: A:CF思维联系–CodeForces -214C (拓扑排序+思维+贪心) B:CF–思维练习-- CodeFo ...
 - Codeforces 1129 E.Legendary Tree
		
Codeforces 1129 E.Legendary Tree 解题思路: 这题好厉害,我来复读一下官方题解,顺便补充几句. 首先,可以通过询问 \(n-1\) 次 \((S=\{1\},T=\{ ...
 
随机推荐
- Flink Yarn的2种任务提交方式
			
Flink Yarn的2种任务提交方式 Pre-Job模式介绍 每次使用flink run运行任务的时候,Yarn都会重新申请Flink集群资源(JobManager和TaskManager),任务执 ...
 - Dapr-服务调用
			
前言 上一篇对Dapr进行了了解,并搭建了Dapr环境.接下来就对Dapr的各个构建块类型的了解.应用实际案例. 一.服务调用: 在许多具有多个需要相互通信的服务的环境中,都会面临着很多问题. 如: ...
 - 【UE4 设计模式】设计模式一些概念
			
定义 设计模式是一套被反复使用的.多数人知晓的.经过分类编目的.代码设计经验的总结. 使用设计模式是为了重用代码.让代码更容易被他人理解.保证代码可靠性. 四人帮 GOF ( Gang of Four ...
 - nsq - 一条消息的生命周期(一)
			
经过前面几篇的学习,相信大家对nsq已经有了一个大概的了解,我在写这篇文章的时候也看了很多其他人写的教程,发现大家对于分析系统每个点写的很不错,但是都很少有整体串起来一起走一遍,所以,我打算分成2-3 ...
 - .Net 5下的单文件部署
			
由于.net程序没有静态链接,一直缺乏单文件部署这种干净的发布方案.对客户端程序发布并不是很友好.在之前的.net framework下,有ILMerge合并程序集,以及LibZ的嵌入资源文件等第三方 ...
 - openmp学习心得(一)
			
主要在vs2015下使用OMP,写一些自己omp的学习心得: 一.在VS2015下OpenMP的使用: 1.VS2015也仅仅支持OpenMP2.0版本,VS对OpenMP的支持并不太好. 2.在VS ...
 - 常用Java API:Math类
			
求最值 最小值 Math.min(int a, int b) Math.min(float a, float b) Math.min(double a, doubleb) Math.min(long ...
 - python中yield的理解
			
首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参数,什么传递的,还口口声声说自己的教程是最简单的,最浅显易懂 ...
 - 神经网络 感知机 Perceptron python实现
			
import numpy as np import matplotlib.pyplot as plt import math def create_data(w1=3,w2=-7,b=4,seed=1 ...
 - 有向路径检查 牛客网 程序员面试金典 C++ Python
			
有向路径检查 牛客网 程序员面试金典 C++ Python 题目描述 对于一个有向图,请实现一个算法,找出两点之间是否存在一条路径. 给定图中的两个结点的指针DirectedGraphNode* a, ...