Codeforces Round #523 (Div. 2) F. Katya and Segments Sets (交互题+思维)
https://codeforces.com/contest/1061/problem/F
题意
假设存在一颗完全k叉树(n<=1e5),允许你进行最多(n*60)次询问,然后输出这棵树的根,每次询问,a,b,c三个点,会返回b是否在a,c之间的路径上
思路
- 粗略看了下询问次数,可以知道,你最多可以询问60对不同的点,每对点遍历n个点,可以知道n个点在不在这两个点的中间
- 一开始的思路是,随机找两个点,遍历所有点,然后记录在他们中间的点,在里面再找两个点,继续上述操作,知道剩下一个点,但是假设某一步挑出的两个点的路径不经过根节点,hack
- 假设树根在第0层,根据完全k叉树的性质,前k-1层点数为\(2^k-1\),第k层点数为\(2^k\),所以大约就是1:1,那么每次问出一个点是否为叶子的概率是1/2,所以可以先找出两个叶子,然后再询问出两个叶子的路径,中间的点就是根节点
- 叶子结点怎么找:将叶子节点作为中间的点,随便找一个另外一个节点,那么叶子结点不在这个节点和其他节点的路径上,询问次数n
规律
- 完全k叉树,叶子:非叶子 约等于 1:1
- 生成随机数后加一个质数再取模,会使数据更加离散,
- 树的叶子十分重要
- 交互题一定要优化到最简询问次数,不然很容易被hack
#include<bits/stdc++.h>
#define pb push_back
using namespace std;
char s[10];
int n,k,d,a,b,vi[2000],i,cnt;
vector<int>p,P;
int pw(int bs,int x){
int ans=1;
while(x){
if(x&1)ans*=bs;bs*=bs;x>>=1;
}
return ans;
}
void op(int a,int b,int x){
vector<int>tp;
memset(vi,0,sizeof(vi));
int cnt=0;
for(int i=1;i<=n;i++){
if(a==i||b==i)continue;
printf("? %d %d %d\n",a,i,b);
fflush(stdout);
scanf("%s",s);
if(s[0]=='Y'){vi[i]=1;cnt++;}
if(x==0&&cnt==2*d-3)break;
if(x&&cnt>d-2)break;
}
for(int i=1;i<=n;i++)if(vi[i])tp.pb(i);
if(x==0)P=tp;
else p=tp;
}
int main(){
scanf("%d %d",&n,&k);
for(d=1;;d++)if((pw(k,d)-1)/(k-1)==n)break;
for(;;){
a=(rand()+4399)%n+1;b=(rand()+2755)%n+1;
if(a==b){b++;b=b%n+1;}
op(a,b,0);
if(P.size()==2*d-3)break;
}
for(i=0;i<P.size();i++){
op(P[i],a,1);
if(p.size()==d-2){
printf("! %d\n",P[i]);
fflush(stdout);
return 0;
}
}
}
Codeforces Round #523 (Div. 2) F. Katya and Segments Sets (交互题+思维)的更多相关文章
- Codeforces Round #524 (Div. 2) F. Katya and Segments Sets(主席树)
https://codeforces.com/contest/1080/problem/F 题意 有k个区间,区间的种类有n种,有m个询问(n,m<=1e5,k<=3e5),每次询问a,b ...
- Codeforces Round #350 (Div. 2) F. Restore a Number 模拟构造题
F. Restore a Number Vasya decided to pass a very large integer n to Kate. First, he wrote that num ...
- Codeforces Round #496 (Div. 3) E1. Median on Segments (Permutations Edition) (中位数,思维)
题意:给你一个数组,求有多少子数组的中位数等于\(m\).(若元素个数为偶数,取中间靠左的为中位数). 题解:由中位数的定义我们知道:若数组中\(<m\)的数有\(x\)个,\(>m\)的 ...
- Codeforces Round #485 (Div. 2) F. AND Graph
Codeforces Round #485 (Div. 2) F. AND Graph 题目连接: http://codeforces.com/contest/987/problem/F Descri ...
- Codeforces Round #523 (Div. 2)
Codeforces Round #523 (Div. 2) 题目一览表 来源 考察知识点 完成时间 A Coins cf 贪心(签到题) 2018.11.23 B Views Matter cf 思 ...
- Codeforces Round #486 (Div. 3) F. Rain and Umbrellas
Codeforces Round #486 (Div. 3) F. Rain and Umbrellas 题目连接: http://codeforces.com/group/T0ITBvoeEx/co ...
- Codeforces Round #501 (Div. 3) F. Bracket Substring
题目链接 Codeforces Round #501 (Div. 3) F. Bracket Substring 题解 官方题解 http://codeforces.com/blog/entry/60 ...
- Codeforces Round #499 (Div. 1) F. Tree
Codeforces Round #499 (Div. 1) F. Tree 题目链接 \(\rm CodeForces\):https://codeforces.com/contest/1010/p ...
- Codeforces Round #368 (Div. 2) A. Brain's Photos (水题)
Brain's Photos 题目链接: http://codeforces.com/contest/707/problem/A Description Small, but very brave, ...
随机推荐
- 转:WCAT 压力工具介绍
原文地址:http://blogs.msdn.com/alikl/archive/2008/03/09/stress-test-asp-net-web-application-with-free-wc ...
- f5 SNMP配置
1.选择监控终端 2.配置团体名称:
- C++ map中使用erase应该注意到的问题
注意:此程序在win环境下会出现上述描述的问题:在mac环境下第一种方式是正常运行的.Map.erase有3个重载函数: void erase(iterator position); size_typ ...
- ARM板移植udev-126
下载udev-126.tar.xz 下载的网址为: https://mirrors.edge.kernel.org/pub/linux/utils/kernel/hotplug/ 解压文件并且编译 # ...
- VIO回顾:从滤波和优化的视角
https://mp.weixin.qq.com/s/zpZERtWPKljWNAiASBLJxA 根据以上网页自己做的总结: 在机器人社区中,定位与构图问题属于状态估计问题.主流使用的工具可以对给定 ...
- 更换Grade源为阿里云解决下载慢问题
作为程序员,即写的了代码也得翻得上围墙. 现在包管理工具(Maven/grade)的便捷性让人大快朵颐,再也不需要到处找jar包. 如果你没梯子又苦苦无法加快下载速度,不如按照以下设置一下. 对单个项 ...
- u-boot之内核是怎么启动的
在u-boot之start_armboot函数分析已经分析过了整个程序框架,但只是说了下什么时候运行内核,并没有具体说明是怎么执行内核的.内核启动分以下几个步骤说明: 1.启动参数bootcmd=na ...
- ES6 WeakMap和WeakSet的使用场景
JavaScript垃圾回收是一种内存管理技术.在这种技术中,不再被引用的对象会被自动删除,而与其相关的资源也会被一同回收. Map和Set中对象的引用都是强类型化的,并不会允许垃圾回收.这样一来,如 ...
- mysql学习笔记-1.下载与安装
1.到mysql官网下载操作系统对应的数据库,下载地址https://dev.mysql.com/downloads/mysql/ 2.有msi安装版本和zip压缩版本,2种安装方式不同, 3.安装后 ...
- python爬虫_简单使用百度OCR解析验证码
百度技术文档 首先要注册百度云账号: 在首页,找到图像识别,创建应用,选择相应的功能,创建 安装接口模块: pip install baidu-aip 简单识别一: 简单图形验证码: 图片: from ...