博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces Round #503 (by SIS, Div. 2) D. The hat
阅读量:5374 次
发布时间:2019-06-15

本文共 890 字,大约阅读时间需要 2 分钟。

【题目描述】

交互式题目:

n 个人围成一圈,每个人有一个数字,满足相邻两个人数字之差的绝对值小于等于 1. 第 i 个人和第 $i + \frac n 2$ 个人相对而坐,现需知道是否存在相对的一组人拥有的数字相同。可以询问位置 $x$上的人所拥有的数字,询问的个数不超过60。

【算法】

设 $a[i]$ 表示位置 $i$ 上的人的数字,定义函数 $b[i]=a[i]-a[i+\frac n 2]$ ,则题目转换为求 $b[i]=0$ 的点,则 $b[i]$ 满足两个性质:

1、$b[i]=-b[i+\frac n 2]$
2、$\vert b[i+1]-b[i]\vert = ( 2,-2,0 )$
可以证明 $b[0]=-b[\frac n 2]$。又由于性质2,所有 b[i] 奇偶性均相同,故若 b[0] 为奇则答案不存在。反之若为偶,由于 $0\dots \frac n 2$ 上 b[i] 的值满足离散连续性(虽然是离散的数但是相邻的数满足连续性,故满足函数根的存在定理)。于是二分即可。
【代码】

#include 
using namespace std;int n;int ask(int x) { cout<<"? "<
<
>ans; return ans;}int main() { cin>>n; int l=0,r=n>>1; int d2=ask(n>>1)-ask(n),d1=-d2; if(d2&1) { cout<<"! -1"<
>1; int d=ask(mid)-ask(mid+(n>>1)); if(!d) { cout<<"! "<
<

转载于:https://www.cnblogs.com/Willendless/p/9690858.html

你可能感兴趣的文章
ajax如何向后台传递数组,在后台该如何接收的问题(项目积累)
查看>>
Solr之java实现增删查操作
查看>>
httpClient连接工具类实测可用
查看>>
CDOJ 1965 连通域统计【DFS】
查看>>
飞机大战3-我的飞机
查看>>
c#接口
查看>>
MyEclipse部署Jboss出现java.lang.OutOfMemoryError: PermGen space
查看>>
ZOJ 1133
查看>>
alibaba / zeus 安装 图解
查看>>
Ubuntu:让桌面显示回收站
查看>>
Android上传头像代码,相机,相册,裁剪
查看>>
git 安装体验
查看>>
Oracle 给已创建的表增加自增长列
查看>>
if 循环
查看>>
uva 111 History Grading(lcs)
查看>>
Python学习week2-python介绍与pyenv安装
查看>>
php判断网页是否gzip压缩
查看>>
一个有意思的js实例,你会吗??[原创]
查看>>
sql server中bit字段实现取反操作
查看>>
Part3_lesson2---ARM指令分类学习
查看>>