题目链接:http://codeforces.com/contest/1020/problem/D

题意描述:

这是一个交互题,互交题就是你要输出一些问题,评测机就会回答你一些问题

你要在规定的提问次数中找到问题答案并回答后return 0;

这个题目是给出一个偶数n(n<=1e5),n个人编号1到n坐一圈,编号i的对面是编号i+n/2的人(i<=n/2),反过来也是一样

每个人手上有一个数字ai(ai<=1e9),规则是任意相邻两个人的数字之差为1或-1,1和n也满足这个限制

现在你有询问方式《? x》,机器会回答你x编号的人手上的数字。

你的任务是找到任意一个人跟其对面人手上数字相同,并回答《! ans》,ans为满足条件的人

如果没有这样的人,回答《! -1》

题目分析:

考虑n=4k+2的情况,每个人跟其对面的人之间相差2k+1个人,因为任意相邻两个人的数字之差为1或-1,而且2k+1为奇数,那么对面的人跟他经过奇数次+1或-1之后现在不可能是跟他相同数字,所以n=4k+2的情况一定无解。

考虑n=4k的情况,每个人跟其对面的人之间相差2k个人,同上,可能会有解,实际上是必定有解:

图中a[i]表示每个人拥有的数字,d[i]表示第i个人的数字跟对面的人数字之差,

可以发现d[i]和d[i+1]之间的差值只能是+2 -2或0,并且对面两个人之间的d[i]值是相反数,d[i]一定是偶数

题目要求的答案就是di=0的这些点,设位置l和位置r初始相对,由上可知d[l] = -d[r]

那么显然在任意两个异号的d[l]和d[r]之间必定存在d[ans]的值为0,二分即可找到ans,且ans必定存在。

AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,ans[3];
inline int across(int o){    //找到位置o的对面的位置idreturn (o+n/2-1)%n+1;    //-1取模再+1,结果范围在1到n
}
inline int query(int o){printf("? %d\n? %d\n",o,across(o));fflush(stdout);scanf("%d%d",&ans[1],&ans[2]);if(ans[1] == ans[2]){   //询问到答案,输出并退出程序printf("! %d\n",o);fflush(stdout);exit(0);}return ans[1]>ans[2]?1:-1;
}
int main(){scanf("%d",&n);if(n%4){            //n不是4的倍数无解printf("! -1\n");fflush(stdout);return 0;}int T=30,l=1,r=1+n/2,mid,dl,dr,dm;dl=query(l);dr=-dl;while(l+1<r){mid=(l+r)>>1;dm=query(mid);if(dl<0){if(dm<0)l=mid;  //dm与dl同号则更新lelse r=mid;}else if(dr<0){if(dm<0)r=mid;  //dm与dr同号则更新relse l=mid;}}query(r);query(l);return 0;
}

Codeforces Round #503 (by SIS, Div. 2) D. The hat(交互题)相关推荐

  1. Codeforces Round #503 (by SIS, Div. 1)D. the hat

    原题链接:B. The hat 题意:有n(偶数)个人围成一个圈,每个人身上有一个数字,保证相邻两个人的数字差为1, 现在要把第i个人和第i+n/2个人面对面站着,例如现在有8个人,站好后如下: 1 ...

  2. Codeforces Round #503 (by SIS, Div. 2) C. Elections

    气死我了人生中第一次打cf就掉分了 A题大水题浪费太多时间囧明明都是A两题亮老师还上分了.. 表示C题打的时候就想到正解啊(而且还更加优秀,因为家里老爷机暴力跑的超龟以为不行 其实是没认真算复杂度), ...

  3. Educational Codeforces Round 98 (Rated for Div. 2) E. Two Editorials 细节题

    题目连接 真细节题- 选了一个很复杂的做法. 枚举第一个作者AAA选的框,枚举选手iii.你会发现另一个作者BBB选的框对于选手iii来说,会有一些右端点连续的区间比AAA更优.那这样就可以知道作者B ...

  4. Educational Codeforces Round 104 (Rated for Div. 2)A~E解题报告

    Educational Codeforces Round 104 (Rated for Div. 2) A. Arena \quad原题链接 http://codeforces.com/contest ...

  5. Educational Codeforces Round 103 (Rated for Div. 2)A~E解题报告

    Educational Codeforces Round 103 (Rated for Div. 2) A. K-divisible Sum 原题信息 解题思路 AC代码 #include <b ...

  6. Educational Codeforces Round 114 (Rated for Div. 2) (A ~ F)全题解

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Educational Codeforces Round 114 (Rated for Div. 2) ...

  7. Educational Codeforces Round 106 (Rated for Div. 2)(A ~ E)题解(每日训练 Day.16 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 Educational Codeforces Round 106 (Rated for Div. ...

  8. Educational Codeforces Round 37 (Rated for Div. 2) 1

    Educational Codeforces Round 37 (Rated for Div. 2) A.Water The Garden 题意:Max想给花园浇水.花园可被视为长度为n的花园床,花园 ...

  9. Educational Codeforces Round 90 (Rated for Div. 2)(A, B, C, D, E)

    Educational Codeforces Round 90 (Rated for Div. 2) Donut Shops 思路 分三种情况: a==c/ba == c / ba==c/b这个时候两 ...

最新文章

  1. /* * 编程题第四题(20分): 用1元5角钱人名币兑换5分、2分和1分的硬币(每一种都要有)共一百枚,问共有几种兑换方案?并输出每种方案。 */
  2. npm无法安装node-sass的解决方法
  3. 朱宁:70%散户跑不赢大盘?因为机构利用了他们的错误
  4. 打印dog信息java_java – 打印arraylist元素?
  5. 图解CSS3----5-否定伪类选择器
  6. 目标检测的性能上界讨论
  7. 【转】 解决IllegalStateException: Can not perform this action after onSaveInstanceState
  8. 杭电oj-----Nightmare(BFS)
  9. Go 爱好者福利,《Go 语言编程之旅》正式开源!
  10. Foobar2000目前最强解码方案
  11. Visual Studio 2008破解激活升级方法【转】
  12. CDIO工程实践 无线充电智能循迹小车制作
  13. 使用 VLD 检测内存泄漏
  14. php lanyu idea,IDEA使用
  15. 从零开始搭建仿抖音短视频APP-开发用户业务模块(3)
  16. 管理 Office com 加载项
  17. 电脑监控软件可以监控到企业微信吗?
  18. dreamweaver作业静态HTML网页设计模板 中国传统书法
  19. rdkafka线程过多_我是如何处理大并发量订单处理的 KafKa部署总结
  20. android自定义button样式

热门文章

  1. 基于虚拟同步机的柔性直流输电(HVDC)控制Matlab/simulink仿真模型
  2. 7z压缩文件及文件夹命令.
  3. 什么是增值电信业务经营户许可证?
  4. List元素去重的六种方式
  5. c++ opencv 图像处理:直方图处理(直方图均衡化,直方图匹配(规定化))
  6. (Adventure项目)自行车业务数据分析报告(二)
  7. ADI Blackfin DSP处理器-BF533的开发详解10:SPORT-IIS口驱动和应用(含源代码)
  8. 如何治好自己的选择恐惧症
  9. 2019年中国全国5级行政区划(省、市、县(区)、镇(街道)、村)
  10. [Visual Studio 2022 C#]使用SplitContainer拆分器让一个Windows窗口秒变多个