「题解」「CF1019B」The hat
题目
背景
这是一道交互题。
一共有 \(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)\) ,表示这个圈里面的人数,然后你可以输出以下两种格式的操作:
? x
表示你想询问位置为 \(x\) 的人手中的数字,询问不可执行超过 \(60\) 次;! 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\),下面给出后者的解释:
- 当 \(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\) ;
- 另外两种情况可以用上面的方法自行思考;
现在我们要求的,就是一个位置 \(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的更多相关文章
- 「ZJOI2019」&「十二省联考 2019」题解索引
「ZJOI2019」&「十二省联考 2019」题解索引 「ZJOI2019」 「ZJOI2019」线段树 「ZJOI2019」Minimax 搜索 「十二省联考 2019」 「十二省联考 20 ...
- 「题解」「美团 CodeM 资格赛」跳格子
目录 「题解」「美团 CodeM 资格赛」跳格子 题目描述 考场思路 思路分析及正解代码 「题解」「美团 CodeM 资格赛」跳格子 今天真的考自闭了... \(T1\) 花了 \(2h\) 都没有搞 ...
- 「题解」「HNOI2013」切糕
文章目录 「题解」「HNOI2013」切糕 题目描述 思路分析及代码 题目分析 题解及代码 「题解」「HNOI2013」切糕 题目描述 点这里 思路分析及代码 题目分析 这道题的题目可以说得上是史上最 ...
- 「题解」JOIOI 王国
「题解」JOIOI 王国 题目描述 考场思考 正解 题目描述 点这里 考场思考 因为时间不太够了,直接一上来就着手暴力.但是本人太菜,居然暴力爆 000 ,然后当场自闭- 一气之下,发现对 60pts ...
- 【题解】「P6832」[Cnoi2020]子弦
[题解]「P6832」[Cnoi2020]子弦第一次写月赛题解( 首先第一眼看到这题,怎么感觉要用 \(\texttt{SAM}\) 什么高科技的?结果一仔细读题,简单模拟即可. 我们不难想出,出现最 ...
- 「题解报告」 P3167 [CQOI2014]通配符匹配
「题解报告」 P3167 [CQOI2014]通配符匹配 思路 *和?显然无法直接匹配,但是可以发现「通配符个数不超过 \(10\) 」,那么我们可以考虑分段匹配. 我们首先把原字符串分成多个以一个通 ...
- 「bzoj1003」「ZJOI2006」物流运输 最短路+区间dp
「bzoj1003」「ZJOI2006」物流运输---------------------------------------------------------------------------- ...
- 「bzoj1925」「Sdoi2010」地精部落 (计数型dp)
「bzoj1925」「Sdoi2010」地精部落---------------------------------------------------------------------------- ...
- 「BZOJ1924」「SDOI2010」 所驼门王的宝藏 tarjan + dp(DAG 最长路)
「BZOJ1924」[SDOI2010] 所驼门王的宝藏 tarjan + dp(DAG 最长路) -------------------------------------------------- ...
- 「LOJ#10051」「一本通 2.3 例 3」Nikitosh 和异或(Trie
题目描述 原题来自:CODECHEF September Challenge 2015 REBXOR 1≤r1<l2≤r2≤N,x⨁yx\bigoplus yx⨁y 表示 ...
随机推荐
- 从Windows10中彻底删除【3D对象】文件夹
Remove "3D object" folder from My Computer Windows Registry Editor Version 5.00 [-HKEY_LOC ...
- shelll高级编程【实战】(1)
shell优势在于处理操作系统底层业务,2000多个命令都是shell的支持. 一键安装,报警脚本,常规业务操作,shell开发更简单快速. 1- 常用操作系统默认shell linux: Bourn ...
- CF1300E Water Balance
题目链接 problem 给出一个长度为n的序列,每次可以选择一个区间\([l,r]\)并将区间\([l,r]\)内的数字全部变为这些数字的平均数.该操作可以进行任意多次. 求出进行任意次操作后可以得 ...
- webkit 技术内幕 笔记 一
目前应用最广的渲染引擎项目-webkit webkit 内部渲染html网页的原理 webkit 内容工作原理 web 的接入口浏览器 浏览器的内核-渲染引擎(像webkit)
- mybatis及其与hibernate的对比
1.mybatis是支持普通SQL查询.存储过程.和高级映射的优秀持久层框架 它消除了JDBC代码和参数的手工设置,以及对结果集的检索 2.mybatis使用简单的XML或注解用于配置和原始映射,将接 ...
- 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]\) ...
- 常用的一些git命令整合
一.创建一个版本库 1.mkdir xxx 2.git init 使用git init命令将这个目录变成Git可以管理的仓库 这个版本仓库创建好了,xxx目录下有一个隐藏的.git目录(里面有暂存区( ...
- 2级搭建类EM-Oracle EMCC 13c Release 3 在 OEL 7.7 上的搭建
Oracle Enterprise Manager Cloud Control 13c Release 3 (13.3.0.0) 安装
- 洛谷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, ...
- nginx proxy_set_header Host $host 和 proxy_set_header Host $http_host 的作用对比
转载自https://www.jianshu.com/p/7a8a7eb3707a 1.浏览器直接访问服务,获取到的 Host 包含浏览器请求的 IP 和端口 测试服务器,centos 7 sudo ...