The hat

280 篇文章 1 订阅
10 篇文章 0 订阅

题目

传送门 to VJ

题目概要
对于数列 a 1 , a 2 , a 3 , … , a n a_1,a_2,a_3,\dots,a_n a1,a2,a3,,an ,满足相邻两项的差为一,且最后一项与第一项差为一。

任求一个 x x x 使得 a x = a x + n 2 a_x=a_{x+\frac{n}{2}} ax=ax+2n 。你有 60 60 60 次机会询问 a a a 数列中某一项的值。

数据范围与约定
n ≤ 1 0 5 n\le 10^5 n105 n n n 将于输入中给出。

思路

我们因地制宜,令 f ( x ) = a x − a x + n 2 f(x)=a_x-a_{x+\frac{n}{2}} f(x)=axax+2n

问题为求其零点。

不妨令 a x = a x − n ( n < x ) a_x=a_{x-n}(n<x) ax=axn(n<x) ,即将 a a a 数列重复无数次。

不难发现,现在的 a a a 数列仍然满足 a x − a x − 1 ∈ { − 1 , 1 } a_x-a_{x-1}\in\{-1,1\} axax1{1,1} (本质是破环成链,复制了一次)。

此时, f ( x ) − f ( x − 1 ) = ( a x − a x − 1 ) − ( a x + n 2 − a x − 1 + n 2 ) f(x)-f(x-1)=(a_x-a_{x-1})-(a_{x+\frac{n}{2}}-a_{x-1+\frac{n}{2}}) f(x)f(x1)=(axax1)(ax+2nax1+2n) ,因为两者都是 { − 1 , 1 } \{-1,1\} {1,1} 中的一个值,所以

f ( x ) − f ( x − 1 ) ∈ { + 2 , 0 , − 2 } f(x)-f(x-1)\in\{+2,0,-2\} f(x)f(x1){+2,0,2}

那么,可以看出,如果说将纵轴压缩一下,原本的 ( x , y ) (x,y) (x,y) 压缩到 ( x , y 2 ) (x,\frac{y}{2}) (x,2y) ,那么 f ( x ) f(x) f(x) 是“连续”的。

由定义,我们还发现 f ( 1 ) + f ( n 2 + 1 ) = 0 f(1)+f\left(\frac{n}{2}+1\right)=0 f(1)+f(2n+1)=0

也就是说, f ( 1 ) f(1) f(1) f ( n 2 + 1 ) f(\frac{n}{2}+1) f(2n+1) 异号

异号,且连续,求零点,众所周知,用 二分法即可

代码

#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
inline int readint(){
	int a = 0; char c = getchar(), f = 1;
	for(; c<'0' or c>'9'; c=getchar())
		if(c == '-') f = -f;
	for(; '0'<=c and c<='9'; c=getchar())
		a = (a<<3)+(a<<1)+(c^48);
	return a*f;
}
inline void writeint(int x){
	if(x > 9) writeint(x/10);
	putchar((x%10)^48);
}
# define MB template < class T >
MB void getMax(T &a,const T &b){ if(a < b) a = b; }
MB void getMin(T &a,const T &b){ if(b < a) a = b; }

int query(int x){
	printf("? %d\n",x);
	fflush(stdout);
	return readint();
}

# define f(x) (query(x)-query(x+(n>>1)))
# define guess(x) { printf("! %d\n",x); return 0; }
int main(){
	int n = readint(); // 难得的没有压行
	int l = 1, lval = f(l), r = (n>>1), rval = f(r);
	if(lval%2 != 0) guess(-1); // impossible
	if(lval == 0) guess(l); if(rval == 0) guess(r);
	while(true){ // 范围是(l,r)
		int mid = (l+r)>>1, d = f(mid); if(d == 0) guess(mid);
		if((d > 0) != (lval > 0)) r = mid; else l = mid;
	} // 一定会运行一次GUESS的
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的校园二手书交易平台,源码+数据库+毕业论文+视频演示 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容越多,也需要更多的人来对数据进行整理,并且数据的汇总查询方面效率也是极其的低下,并且数据安全方面永远不会保证安全性能。结合数据内容管理的种种缺点,在互联网时代都可以得到有效的补充。结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。本次开发的校园二手书交易平台实现了图书信息查询。系统用到了关系型数据库中MySql作为系统的数据库,有效的对数据进行安全的存储,有效的备份,对数据可靠性方面得到了保证。并且程序也具备程序需求的所有功能,使得操作性还是安全性都大大提高,让校园二手书交易平台更能从理念走到现实,确确实实的让人们提升信息处理效率。 关键字:信息管理,时效性,安全性,MySql;Spring Boot
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值