[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 ...
随机推荐
- GAN!生成对抗网络GAN全维度介绍与实战
本文为生成对抗网络GAN的研究者和实践者提供全面.深入和实用的指导.通过本文的理论解释和实际操作指南,读者能够掌握GAN的核心概念,理解其工作原理,学会设计和训练自己的GAN模型,并能够对结果进行有效 ...
- Java Maven POM配置参考
介绍 什么是POM? POM代表"项目对象模型".它是一个名为pom.XML的文件中保存的Maven项目的XML表示. 快速概览 这是一个直接位于POM项目元素下的元素列表.请注意 ...
- Leetcode刷题笔记——单调性
单调性 单调性是数学中使用的一种常见性质,通常用于描述函数,在高等数学中的定义常常为: 设函数f(x)在区间I上有定义,如果对于I上的任意两个数x1和x2,当x1<x2时,有f(x1)<f ...
- QA|Pycharm中的git分支提交冲突问题和解决|GIT
前天,Pycharm中的git分支提交冲突了,原因是我PC上改了文件没有提交,笔记本又本地改代码,笔记本提交时就出现报错:提交拒绝,但pull也被拒绝,网上试了rebase等方法,均没得到解决,最终自 ...
- 探索计算机的I/O控制方式:了解DMA控制器的作用与优势
I/O控制方式 在前面我们已经了解到,每个设备都配备了一个设备控制器.当CPU向设备控制器发送命令并将其存储在寄存器中时,设备控制器会执行相应的操作.然而,尽管设备控制器会更新状态寄存器的状态,但是如 ...
- 【目标检测】RCNN算法实现
一.前言 RCNN(Regions with CNN features)算法由Ross Girshick在2014年的论文"Rich feature hierarchies for accu ...
- 【matplotlib基础】--绘图配置
Matplotlib 提供了大量配置参数,这些参数可以但不限于让我们从整体上调整通过 Matplotlib 绘制的图形样式,这里面的参数还有很多是功能性的,和其他工具结合时需要用的配置. 通过plt. ...
- 「loj - 3022」「cqoi 2017」老 C 的方块
link. good题,考虑像 国家集训队 - happiness 一样在棋盘上搞染色,我毛张 @shadowice1987 的图给你看啊 你像这样奇数层以 red -> blue -> ...
- centos7离线安装docker和docker-compose
1.找一台可联网的centos7主机 在这台可以联网的机器上把离线包都下载好. 2.下载docker rpm安装包和相关依赖 ## 安装yum-utils包,添加docker yum源 sudo yu ...
- 形象描绘TCP三次握手和四次挥手
一.TCP三次握手TCP 三次握手就好比两个人在街上隔着50米看见了对方,但是因为雾霾等原因不能100%确认,所以要通过招手的方式相互确定对方是否认识自己.形象描绘TCP三次握手和四次挥手 张三首先向 ...