题目

背景

这是一道交互题。

一共有 \(n\) 个人做成一圈,他们的编号从 \(1\) 到 \(n\)。

现在每个人的手里面都有一个数字 \(a_i\) ,并且保证每个人与他周围两个人的数字差为 \(1\) ,即 \(\mid a_i-a_{i\pm 1}\mid =1\) ,特别地,编号为 \(1\) 与 \(n\) 的人也满足这个规则。

在这个圈里面,编号为 \(i\) 的人的对面坐着的是编号为 \(i+\frac{n}{2}\) 的人(其中 \(i\le \frac{n}{2}\)),现在要你找到哪个人与他对面坐着的那个人手中的数字一样。

程序输出

在最开始,交互程序会给你一个 \(n(2\mid n, n\le 10^5)\) ,表示这个圈里面的人数,然后你可以输出以下两种格式的操作:

  1. ? x 表示你想询问位置为 \(x\) 的人手中的数字,询问不可执行超过 \(60\) 次;
  2. ! x 表示你的程序的答案,即满足 \(a_x=a_{x+\frac{n}{2}}(x\le \frac{n}{2})\) ,特别地,如果找不到答案,则输出 ! -1

交互程序输入

对于操作 \(1\) ,交互程序会输出一个整数 \(a_x\) 表示 \(x\) 编号的人手中的数字。

对于操作 \(2\) ,如果你的答案是错误的,程序会直接退出,且测试结果为 Wrong Answer ,否则若无其他问题则测试结果为 Accepted

题解

一道十分有思维含量的好题 我太弱了,想了一个小时 。

首先,若 \(n=4k+2\) ,那么 \(\frac{n}{2}=2k+1\) ,即对于位置 \(i\) ,它对面的位置 \(i+\frac{n}{2}=i+2k-1\) ,可以发现他们相差奇数个位置,那么一定有他们的奇偶性不同,即他们一定不同,所以当 \(n=4k+2\) 时一定无解,至于 \(n=4k+1\) 或者 \(n=4k+3\) ,那是不可能的,题目保证 \(2\mid n\) 。

所以,只有当 \(4\mid n\) 时才有解,现在我们考虑如何快速求解。

对于位置 \(i,i\in [1,n]\) ,我们设它对面的位置为 \(i'\) ,再记 \(a_i-a_{i'}=t_i\) ,那么一定有 \(2\mid t_i\) 且 \(t_i-t_{i+1}=\pm 2 或 0\),下面给出后者的解释:

  1. 当 \(a_i=a_{i+1}+1\) ,且 \(a_{i'}=a_{(i+1)'}+1\) 时,\(t_{i+1}=a_i-1-a_{i'}+1=a_i-a_{i'}\) ,即 \(t_i-t_{i+1}=0\) ;
  2. 另外两种情况可以用上面的方法自行思考;

现在我们要求的,就是一个位置 \(i\) 能够满足 \(d_i=0\) 。

而我们已经证明 \(t_i\) 之间的差为 \(\pm 2 或 0\) ,那么,假设我们枚举到一个区间 \([l,r]\) ,如果 \(t_l\) 与 \(t_r\) 异号,则满足 \(t_i=0\) 的 \(i\) 一定属于区间 \([l,r]\) 。

为什么?\(t_l\) 一定是通过不断 \(-2\) 或者 \(+2\) 来达到另外一种符号,而在这个过程中一定会经过 \(t_i=0\) 的那个点。


update on 2020.2.5

\(\text{ZXY}\) 大佬在此处提出一个问题:如果 \(t_l\) 与 \(t_r\) 一开始就同号,并且有解怎么办?

我们需要把上面的结论推广一下:如果存在解,那么 \(t_l\) 与 \(t_r\) 一定是异号的。

但特别地,我们为了保证 \(t_l\) 与 \(t_r\) 一开始异号,只需让 \(l=1,r=\frac{n}{2}+1\) 即可。

这样我们就可以保证在我们的区间之中是一定有解的。

那么万一 \(t_l\) 和 \(t_r\) 一开始就是 \(0\) 怎么办?这不就是答案吗......

但是因为这个原因,代码中有一些细节需要更改,详见代码标注 update 部分。


如果还有一些问题,可见程序。

程序

#include<cstdio>
#include<cstdlib> #define rep(i,__l,__r) for(signed i=__l,i##_end_=__r;i<=i##_end_;++i)
#define fep(i,__l,__r) for(signed i=__l,i##_end_=__r;i>=i##_end_;--i)
#define writc(a,b) fwrit(a),putchar(b)
#define mp(a,b) make_pair(a,b)
#define ft first
#define sd second
#define LL long long
#define ull unsigned long long
#define uint unsigned int
#define pii pair< int,int >
#define Endl putchar('\n')
// #define FILEOI
// #define int long long
// #define int unsigned #ifdef FILEOI
# define MAXBUFFERSIZE 500000
inline char fgetc(){
static char buf[MAXBUFFERSIZE+5],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,MAXBUFFERSIZE,stdin),p1==p2)?EOF:*p1++;
}
# undef MAXBUFFERSIZE
# define cg (c=fgetc())
#else
# define cg (c=getchar())
#endif
template<class T>inline void qread(T& x){
char c;bool f=0;
while(cg<'0'||'9'<c)f|=(c=='-');
for(x=(c^48);'0'<=cg&&c<='9';x=(x<<1)+(x<<3)+(c^48));
if(f)x=-x;
}
inline int qread(){
int x=0;char c;bool f=0;
while(cg<'0'||'9'<c)f|=(c=='-');
for(x=(c^48);'0'<=cg&&c<='9';x=(x<<1)+(x<<3)+(c^48));
return f?-x:x;
}
// template<class T,class... Args>inline void qread(T& x,Args&... args){qread(x),qread(args...);}
template<class T>inline T Max(const T x,const T y){return x>y?x:y;}
template<class T>inline T Min(const T x,const T y){return x<y?x:y;}
template<class T>inline T fab(const T x){return x>0?x:-x;}
inline int gcd(const int a,const int b){return b?gcd(b,a%b):a;}
inline void getInv(int inv[],const int lim,const int MOD){
inv[0]=inv[1]=1;for(int i=2;i<=lim;++i)inv[i]=1ll*inv[MOD%i]*(MOD-MOD/i)%MOD;
}
template<class T>void fwrit(const T x){
if(x<0)return (void)(putchar('-'),fwrit(-x));
if(x>9)fwrit(x/10);
putchar(x%10^48);
}
inline LL mulMod(const LL a,const LL b,const LL mod){//long long multiplie_mod
return ((a*b-(LL)((long double)a/mod*b+1e-8)*mod)%mod+mod)%mod;
} const int MAXN=1e5;
const int INF=1e9+5; int n,a[MAXN+5]; inline int opposite(const int p){return (p+(n>>1)-1)%n+1;} inline int Ask(const int p){
if(a[p]!=INF)return a[p];
printf("? %d\n",p),fflush(stdout);
return scanf("%d",&a[p]),a[p];
} inline int TEST(const int p){
int x=Ask(p),y=Ask(opposite(p));
if(x==y){
printf("! %d\n",p),fflush(stdout);
exit(0);
}
return x>y?1:-1;
} signed main(){
#ifdef FILEOI
freopen("file.in","r",stdin);
freopen("file.out","w",stdout);
#endif
scanf("%d",&n);
if(n%4)return printf("! -1\n"),fflush(stdout),0;
rep(i,1,n)a[i]=INF;
int l=1,r=(n>>1)+1,mid,tl=TEST(l),tr=-tl,tm;
//update: r, tr 的初值
while(l<=r){
tm=TEST(mid=l+r>>1);
if(tl*tm<0)r=mid-1,tr=tm;
else if(tm*tr<0)l=mid+1,tl=tm;
}
return printf("! -1\n"),fflush(stdout),0;
}

「题解」「CF1019B」The hat的更多相关文章

  1. 「ZJOI2019」&「十二省联考 2019」题解索引

    「ZJOI2019」&「十二省联考 2019」题解索引 「ZJOI2019」 「ZJOI2019」线段树 「ZJOI2019」Minimax 搜索 「十二省联考 2019」 「十二省联考 20 ...

  2. 「题解」「美团 CodeM 资格赛」跳格子

    目录 「题解」「美团 CodeM 资格赛」跳格子 题目描述 考场思路 思路分析及正解代码 「题解」「美团 CodeM 资格赛」跳格子 今天真的考自闭了... \(T1\) 花了 \(2h\) 都没有搞 ...

  3. 「题解」「HNOI2013」切糕

    文章目录 「题解」「HNOI2013」切糕 题目描述 思路分析及代码 题目分析 题解及代码 「题解」「HNOI2013」切糕 题目描述 点这里 思路分析及代码 题目分析 这道题的题目可以说得上是史上最 ...

  4. 「题解」JOIOI 王国

    「题解」JOIOI 王国 题目描述 考场思考 正解 题目描述 点这里 考场思考 因为时间不太够了,直接一上来就着手暴力.但是本人太菜,居然暴力爆 000 ,然后当场自闭- 一气之下,发现对 60pts ...

  5. 【题解】「P6832」[Cnoi2020]子弦

    [题解]「P6832」[Cnoi2020]子弦第一次写月赛题解( 首先第一眼看到这题,怎么感觉要用 \(\texttt{SAM}\) 什么高科技的?结果一仔细读题,简单模拟即可. 我们不难想出,出现最 ...

  6. 「题解报告」 P3167 [CQOI2014]通配符匹配

    「题解报告」 P3167 [CQOI2014]通配符匹配 思路 *和?显然无法直接匹配,但是可以发现「通配符个数不超过 \(10\) 」,那么我们可以考虑分段匹配. 我们首先把原字符串分成多个以一个通 ...

  7. 「bzoj1003」「ZJOI2006」物流运输 最短路+区间dp

    「bzoj1003」「ZJOI2006」物流运输---------------------------------------------------------------------------- ...

  8. 「bzoj1925」「Sdoi2010」地精部落 (计数型dp)

    「bzoj1925」「Sdoi2010」地精部落---------------------------------------------------------------------------- ...

  9. 「BZOJ1924」「SDOI2010」 所驼门王的宝藏 tarjan + dp(DAG 最长路)

    「BZOJ1924」[SDOI2010] 所驼门王的宝藏 tarjan + dp(DAG 最长路) -------------------------------------------------- ...

  10. 「LOJ#10051」「一本通 2.3 例 3」Nikitosh 和异或(Trie

    题目描述 原题来自:CODECHEF September Challenge 2015 REBXOR 1​​≤r​1​​<l​2​​≤r​2​​≤N,x⨁yx\bigoplus yx⨁y 表示 ...

随机推荐

  1. 从Windows10中彻底删除【3D对象】文件夹

    Remove "3D object" folder from My Computer Windows Registry Editor Version 5.00 [-HKEY_LOC ...

  2. shelll高级编程【实战】(1)

    shell优势在于处理操作系统底层业务,2000多个命令都是shell的支持. 一键安装,报警脚本,常规业务操作,shell开发更简单快速. 1- 常用操作系统默认shell linux: Bourn ...

  3. CF1300E Water Balance

    题目链接 problem 给出一个长度为n的序列,每次可以选择一个区间\([l,r]\)并将区间\([l,r]\)内的数字全部变为这些数字的平均数.该操作可以进行任意多次. 求出进行任意次操作后可以得 ...

  4. webkit 技术内幕 笔记 一

    目前应用最广的渲染引擎项目-webkit webkit 内部渲染html网页的原理 webkit 内容工作原理 web 的接入口浏览器 浏览器的内核-渲染引擎(像webkit)

  5. mybatis及其与hibernate的对比

    1.mybatis是支持普通SQL查询.存储过程.和高级映射的优秀持久层框架 它消除了JDBC代码和参数的手工设置,以及对结果集的检索 2.mybatis使用简单的XML或注解用于配置和原始映射,将接 ...

  6. Wannafly Winter Camp 2020 Day 5G Cryptographically Secure Pseudorandom Number Generator - 分块

    多组数据,给定质数 \(p\) ,求所有 \(x\) 使得 \(f(x)=\min_{k=2}^x f(k)\) ,其中 \(f(x)=x^{-1}\) 所有 \(p\) 在 \([1,10^9]\) ...

  7. 常用的一些git命令整合

    一.创建一个版本库 1.mkdir xxx 2.git init 使用git init命令将这个目录变成Git可以管理的仓库 这个版本仓库创建好了,xxx目录下有一个隐藏的.git目录(里面有暂存区( ...

  8. 2级搭建类EM-Oracle EMCC 13c Release 3 在 OEL 7.7 上的搭建

    Oracle Enterprise Manager Cloud Control 13c Release 3 (13.3.0.0) 安装

  9. 洛谷p1980 计数问题

    题目描述 试计算在区间 111 到 nn n的所有整数中,数字x(0≤x≤9) x(0 ≤ x ≤ 9)x(0≤x≤9)共出现了多少次?例如,在 111到11 11 11中,即在 1,2,3,4,5, ...

  10. nginx proxy_set_header Host $host 和 proxy_set_header Host $http_host 的作用对比

    转载自https://www.jianshu.com/p/7a8a7eb3707a 1.浏览器直接访问服务,获取到的 Host 包含浏览器请求的 IP 和端口 测试服务器,centos 7 sudo ...