「题解」「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 表示 ...
随机推荐
- LeetCode 13、罗马数字转整数
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1.12 ...
- USB闪存驱动器未显示在MacOS的Finder或磁盘工具上?为什么Mac无法识别USB该如何解决?
您可能会在Mac上无法显示的闪存驱动器上形成困扰.您确定驱动器正常,但Mac计算机无法检测到. 阅读这篇文章,闪存驱动器未显示在MacOS的Finder或磁盘工具上?为什么Mac无法识别USB该如何 ...
- Petya and Array CodeForces - 1042D
很不错的一道题 给你一个长度为n的数组,问共有多少个区间满足区间之和小于给定的数t 这种题一般做法肯定是枚举,固定左端点枚举右端点,枚举的过程需要优化,否则就是n方 这道题我先求一个前缀和,然后逆着枚 ...
- canvas-画圆心的算法
公式为x=16sin~3t,y=(13cost-5cos2t-2cos3t-cos4t) x+r(16Math.pow(Math.sin(t),3)) y-r(13Math.cos(t)-5Math. ...
- afl-fuzz技术初探
afl-fuzz技术初探 转载请注明出处:http://www.cnblogs.com/WangAoBo/p/8280352.html 参考了: http://pwn4.fun/2017/09/21/ ...
- Pwnable.kr
Dragon —— 堆之 uaf 开始堆的学习之旅. uaf漏洞利用到了堆的管理中fastbin的特性,关于堆的各种分配方式参见堆之*bin理解 在SecretLevel函数中,发现了隐藏的syste ...
- laravel上传git如何忽略你不想提交的文件
1.在文件根目录下面有一个文件 .gitignore .gitignore文件用来忽略被指定的文件或文件夹的改动,被记录在.gitignore文件里的文件或文件夹,是无法被git跟踪到的,换句话说,被 ...
- display: inline-block 布局
三个元素display: inline-block; 布局 ,其中一个元素中存在其他元素也用了display: inline-block; 无法垂直居中,将这个元素设置为display: inline ...
- MyBatis的手动映射与模糊查询
一.手动映射 当实体类属性与数据库字段名不同时,无法自动映射,导致查询出空值,这时候可以使用手动映射 在select节点添加resultMap属性与resultMap节点建立关系
- WSO2 ESB XML定义语法(1)
1.(基于Apache Synapse的WSO2 ESB实现)参考文件位置: http://synapse.apache.org/userguide/config.html 基于Apache Syna ...