题目描述

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的更多相关文章

  1. [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 ...

  2. Michael Schatz - 序列比对课程

    Michael Schatz - Cold Spring Harbor Laboratory 最近在研究 BWA mem 序列比对算法,直接去看论文,看不懂,论文就3页,太精简了,好多背景知识都不了解 ...

  3. POJ 3667 Hotel(线段树 区间合并)

    Hotel 转载自:http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html [题目链接]Hotel [题目类型]线段树 ...

  4. ACM: Hotel 解题报告 - 线段树-区间合并

    Hotel Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Description The ...

  5. HDU - Hotel

    Description The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and e ...

  6. 【POJ3667】Hotel

    Description The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and e ...

  7. POJ-2726-Holiday Hotel

    Holiday Hotel   Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8302   Accepted: 3249 D ...

  8. 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 ...

  9. poj 3667 Hotel(线段树,区间合并)

    Hotel Time Limit: 3000MSMemory Limit: 65536K Total Submissions: 10858Accepted: 4691 Description The ...

  10. [听课笔记]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 ...

随机推荐

  1. Vue的数据更新,页面不更新的解决办法

    可能原因 更新的数据跟源数据不是同一个,即不是同一个引用 解决办法 最稳妥的办法,可通过拿到源数据取索引的方式进行数据的更新,如: 有一个源数据叫:originData 那么如果在更新时,通过this ...

  2. Django+anaconda(spyder)

    一.搭建django虚拟环境 打开anaconda prompt 输入:conda create -n mydjango_env 判断(y/n):y 查看虚拟环境 conda env list *号表 ...

  3. ABP Framework 7.4 RC 新增功能简介:增强微服务架构支持

    ABP Framework 版本号:7.4.0-rc.1 发布时间:2023.8.16 阅读原文:ABP.IO Platform 7.4 RC Has Been Published 翻译:iEricL ...

  4. QA|重写了元素定位后报错xx object has no attribute 'find_element'|网页计算器自动化测试实战

    代码如下: 1 # basepage.py 2 3 from selenium import webdriver 4 5 6 class BasePage(): 7 """ ...

  5. 使用docker搭建seafile服务器

    工作需要在单位和家里的不同电脑上同步指定文件夹及其内容.对比了一些解决方案,最终还是选择熟悉的seafile来做. 需要按照官方文档进行seafile的安装,选择官方推荐的docker方式快速部署. ...

  6. [NSSCTF 2022 Spring Recruit]babyphp

    打开靶机,先看了一遍代码,发现要拿到flag,就必须先满足三个条件,即分别为a,b,c 第一层:需要a满足条件 isset($_POST['a'])&&!preg_match('/[0 ...

  7. LINUX基础知识和命令 二

    LINUX alias (别名) 自定义命令=原始命令 原始命令中有特殊符@#%()请打上 引号,单双无所谓 例:vim /etc/sysconfig/network-scripts/ifcfg-en ...

  8. 我与Vue.js 2.x 的七年之痒

    --过去日子的回顾(这是个副标题) --其实这是篇广告软文(这是个副副标题) 以下是一些牢骚和感悟,不感兴趣的可以滑倒最下面,嘻嘻. 每每回忆起从前,就感觉时间飞逝,真切的感受到了那种课本中描述的白驹 ...

  9. Unity3D 选择焦点切换

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  10. Velocity之Hello World(入门实例)

    参考:http://blog.csdn.net/mengxuwq/article/details/1871161 (非常感谢这篇文章,让我初步入门) 自己调试完全能运行后,写在此,供新人参考,供自己温 ...