[CF1854D] Michael and Hotel
题目描述
Michael and Brian are stuck in a hotel with $ n $ rooms, numbered from $ 1 $ to $ n $ , and need to find each other. But this hotel's doors are all locked and the only way of getting around is by using the teleporters in each room. Room $ i $ has a teleporter that will take you to room $ a_i $ (it might be that $ a_i = i $ ). But they don't know the values of $ a_1,a_2, \dots, a_n $ .
Instead, they can call up the front desk to ask queries. In one query, they give a room $ u $ , a positive integer $ k $ , and a set of rooms $ S $ . The hotel concierge answers whether a person starting in room $ u $ , and using the teleporters $ k $ times, ends up in a room in $ S $ .
Brian is in room $ 1 $ . Michael wants to know the set $ A $ of rooms so that if he starts in one of those rooms they can use the teleporters to meet up. He can ask at most $ 2000 $ queries.
The values $ a_1, a_2, \dots, a_n $ are fixed before the start of the interaction and do not depend on your queries. In other words, the interactor is not adaptive.
$ 2 \leq n \leq 500 $
当你已经知道了 \(1\) 所在的环之后,就很好判断一个点和在一个连通块了。判断一下这个点走 \(n\) 步之后是否在那个环就行了。
我们可以用二分求出一个 \(a_x\).
可以先用 \(1\) 走 \(n\) 步得到环上的某一个点 \(x\),如何扩展出整个环。首先可以一个个求 \(a_x\),那么大概是 \(9n\) 的时间,不行。
考虑倍增。假设我们现在得到了环上的 \(c\) 个点,那么我们可以通过询问一个点走 \(c\) 步是否在环上,这样可以在 \(O(n)\) 的次数内求出 \(c\) 个环上的点。
考虑把上面两种方式结合起来,先用第一种方法求出 \(64\) 个点,然后用第二种方法倍增出剩下的就行了。
细节很多。
#include<bits/stdc++.h>
using namespace std;
const int N=505;
int n,x,a[N],v[N],p[31][N],k,q[N],fa[N],m=1,cnt=0;
mt19937 gen(time(0));
int find(int x)
{
if(fa[x]==x)
return x;
return fa[x]=find(fa[x]);
}
int ok()
{
int c=0;
for(int i=1;i<=n;i++)
fa[i]=i;
for(int i=1;i<=n;i++)
fa[find(p[0][i])]=find(i);
for(int i=1;i<=n;i++)
if(find(i)==find(1))
++c;
if(c^m)
return 0;
for(int i=1;i<=m;i++)
if(find(a[i])^find(1))
return 0;
return 1;
}
void maker()
{
for(int i=1;i<=n;i++)
{
p[0][i]=gen()%n+1;
//printf("%d ",p[0][i]);
}
for(int j=1;j<=30;j++)
for(int k=1;k<=n;k++)
p[j][k]=p[j-1][p[j-1][k]];
}
/*int qry(int x,int k,int m)
{
++cnt;
int px=x;
if(x>n||x<1)
{
puts("Wrong query");
return 0;
}
for(int i=30;~i;--i)
if(k>>i&1)
x=p[i][x];
for(int i=1;i<=m;i++)
if(q[i]==x)
return 1;
return 0;
}*/
int ask(int u,int k)
{
int l=1,r=n;
while(l<r)
{
int md=l+r>>1;
printf("? %d %d %d ",u,k,md-l+1);
for(int i=l;i<=md;i++)
printf("%d ",i);
puts("");
fflush(stdout);
scanf("%d",&x);
/*for(int i=l;i<=md;i++)
q[i-l+1]=i;
x=qry(u,k,md-l+1);*/
if(x)
r=md;
else
l=md+1;
}
return l;
}
int main()
{
scanf("%d",&n);
maker();
a[1]=ask(1,1000000000);
v[a[1]]=1;
for(int i=1;i>=0&&i<=n;i<<=1)
{
int pm=m;
if(i*9<n)
{
for(int j=1;j<=i;j++)
{
a[m+1]=ask(a[m],1),++m;
if(v[a[m]])
j=i,i=-1,--m;
else
v[a[m]]=1;
}
}
else
{
for(int j=1;j<=n;j++)
{
if(v[j])
continue;
printf("? %d %d %d ",j,i,m);
for(int k=1;k<=m;k++)
printf("%d ",a[k]);
puts("");
fflush(stdout);
scanf("%d",&x);
/*for(int k=1;k<=i;k++)
q[k]=a[k];
x=qry(j,i,i);*/
if(x)
v[a[++m]=j]=1;
}
}
if(m==pm)
break;
if(2*i>m)
break;
}
q[1]=a[1];
for(int i=1;i<=n;i++)
{
if(!v[i])
{
printf("? %d 1000000000 %d ",i,m);
for(int j=1;j<=m;j++)
printf("%d ",a[j]);
puts("");
fflush(stdout);
scanf("%d",&x);
/*for(int j=1;j<=m;j++)
q[j]=a[j];
x=qry(i,1000000000,m);*/
if(x)
a[++m]=i;
}
}
printf("! %d ",m);
for(int i=1;i<=m;i++)
printf("%d ",a[i]);
fflush(stdout);
/*if(ok())
printf("succes,%d\n",cnt);
else
puts("failed");*/
return 0;
}
[CF1854D] Michael and Hotel的更多相关文章
- [ZZ] A Proposal For Compiling Direct3D HLSL With LLVM (Written by Michael Larabel )
http://www.phoronix.com/scan.php?page=news_item&px=OTI2NA Note: Something very instersting to w ...
- Michael Schatz - 序列比对课程
Michael Schatz - Cold Spring Harbor Laboratory 最近在研究 BWA mem 序列比对算法,直接去看论文,看不懂,论文就3页,太精简了,好多背景知识都不了解 ...
- POJ 3667 Hotel(线段树 区间合并)
Hotel 转载自:http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html [题目链接]Hotel [题目类型]线段树 ...
- ACM: Hotel 解题报告 - 线段树-区间合并
Hotel Time Limit:3000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Description The ...
- HDU - Hotel
Description The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and e ...
- 【POJ3667】Hotel
Description The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and e ...
- POJ-2726-Holiday Hotel
Holiday Hotel Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8302 Accepted: 3249 D ...
- Method threw 'org.hibernate.exception.SQLGrammarException' exception. Cannot evaluate com.hotel.Object_$$_jvst485_15.toString()
数据库字段和类Object属性不匹配,Method threw 'org.hibernate.exception.SQLGrammarException' exception. Cannot eval ...
- poj 3667 Hotel(线段树,区间合并)
Hotel Time Limit: 3000MSMemory Limit: 65536K Total Submissions: 10858Accepted: 4691 Description The ...
- [听课笔记]Professor Michael Cusumano's New Book:" Strategy Rules: Five Timeless Lessons from Bill Gates, Andy Grove, and Steve Jobs"
1. Look Forward, Reason Back Extrapolate, interpret, then tie vision to concrete actions2. Make Big ...
随机推荐
- 混合开发模式是否可以在App备案制度下突围
网站 ICP 备案已施行了很久,我们也非常清楚必须在进行 ICP 备案后,网站才能在大陆范围合法运营,并且用户可以通过域名正常访问网站. 但是月初出了新规,明年起,国内的 App 也要像网站一样进行备 ...
- API接口的对接流程和注意事项
API接口的对接流程和注意事项 随着互联网技术的发展和数字化时代的到来,API接口已经成为应用程序之间进行数据交换和通信的重要方式.API即应用程序接口,是一种定义.调用和交互的规范,使得不同应用 ...
- 回归克里格、普通克里格插值在ArcGIS中的实现
本文介绍基于ArcMap软件,实现普通克里格.回归克里格方法的空间插值的具体操作. 目录 1 背景知识准备 2 回归克里格实现 2.1 采样点与环境变量提取 2.2 子集要素划分 2.3 异常值提 ...
- HTML一键打包APK工具最新版1.9.2更新(附下载地址)
HMTL网址打包APK,可以把本地HTML项目, Egret游戏,网页游戏,或者网站打包为一个安卓应用APK文件,无需编写任何代码,也无需配置安卓开发环境,支持在最新的安卓设备上安装运行. 打包软件会 ...
- 试试用Markdown来设计表单
相信很多后端开发.对于前端知识是比较零碎的,所以很多时候写表单这样的工作,一般就是复制黏贴,然后改改字段.对于HTML格式,一直觉得比较杂乱,不够简洁. 最近TJ发现了一个有趣的小工具:Create ...
- 工作中常用的一些Git骚操作,一般人我不告诉他。
一.Git提交代码 1 git pull 从服务器上拉取代码 2 git status 查看文件的状态 3 git add . 添加所有文件到暂存区 4 git commit -m "提交的 ...
- NebulaGraph实战:3-信息抽取构建知识图谱
自动信息抽取发展了几十年,虽然模型很多,但是泛化能力很难用满意来形容,直到LLM的诞生.虽然最终信息抽取质量部分还是需要专家审核,但是已经极大的提高了信息抽取的效率.因为传统方法需要大量时间来完成 ...
- Django框架——模板层
文章目录 1 模板层 一 模版简介 二 模版语法之变量 views.py html文件 三 模版之过滤器 语法: default length filesizeformat date slice tr ...
- Asp-Net-Core开发笔记:快速在已有项目中引入EFCore
前言 很多项目一开始选型的时候没有选择EFCore,不过EFCore确实好用,也许由于种种原因后面还是需要用到,这时候引入EFCore也很方便. 本文以 StarBlog 为例,StarBlog 目前 ...
- mooc第五单元《管理组织》单元测试
第五单元<管理组织>单元测试 返回 本次得分为:30.00/50.00, 本次测试的提交时间为:2020-08-30, 如果你认为本次测试成绩不理想,你可以选择 再做一次 . 1 ...