打卡信奥刷题(1661)用C++实现信奥 P7849 「JZOI-2」猜数列

P7849 「JZOI-2」猜数列

题目背景

团员们满脑子都是办周年庆,但小僖只想摸鱼。

于是小僖拿出了最喜欢的数列来考考你。

题目描述

小僖有一个乱序的等差数列 AAA

你可以发出两种询问:

  1. 询问原序列下标为 x,yx,yx,y 的数在等差数列(非模意义下)中的大小关系。
  2. 询问原序列下标为 xxx 的数在等差数列(模意义下)中的值。

但由于交互库出了点问题,你的询问 222 最多能询问 qqq 次。

给定等差数列的长度 nnn 和询问次数 qqq,和固定的模数 p=109+7p=10^{9}+7p=109+7,求这个等差数列的公差 ddd

总询问次数不得超过 2n2n2n 次。交互完成后请立刻输出答案。

交互方式:

输入数列的长度 nnn 和询问次数 qqq 以开始交互。

交互过程中,您可以进行题目描述中的两种询问。

对于第一种询问,交互库将会返回 111 代表 >>>000 代表 <<< 。询问格式为 > x y

对于第二种询问,交互库将会返回一个正整数 AiA_iAi。询问格式为 ? x

在您确定答案后,请以 ! d 的形式输出一行,停止交互。

在您输出一行后,请清空缓冲区:

在 C++ 中,使用 fflush(stdout)cout.flush()

在 Pascal 中,使用 flush(output)

在 Python 中,使用 stdout.flush()

其它语言请自行查阅文档。

请遵循题目完成交互,发出不合法询问可能会出现 TLE,WA 等问题。

输入格式

见交互方式。

输出格式

见交互方式。

数据保证不会有多种可能的 ddd

输入输出样例 #1

输入 #1

3 6
1
2
3

输出 #1

? 1
? 2
? 3
! 1

说明/提示

对于 50%50\%50% 的数据保证 q=2nq=2nq=2n

50%50\%50% 的数据保证 q=2q=2q=2

对于 100%100\%100% 的数据保证 2≤n≤1000002\leq n\leq 1000002n1000000≤Ai<p0\leq A_i< p0Ai<p1≤d<p1\le d < p1d<p

C++实现

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int p=1e9+7;
int main(){
	int n,q,min1,min2,r,res1,res2;
	scanf("%d%d",&n,&q);
	min1=min2=1;
	puts("> 1 2"); fflush(stdout); //这里先询问一遍确定初值
	scanf("%d",&r);
	if(r) min1++;
	else min2++;
	for(int i=3;i<=n;i++)
	{
		printf("> %d %d\n",min1,i); fflush(stdout);
		scanf("%d",&r);
		if(r) {min2=min1; min1=i;}
		else
		{
			printf("> %d %d\n",min2,i); fflush(stdout);
			scanf("%d",&r);
			if(r) min2=i;
		}
	}
	printf("? %d\n",min1); fflush(stdout); scanf("%d",&res1);
	printf("? %d\n",min2); fflush(stdout); scanf("%d",&res2);
	printf("! %d",((res2-res1)%p+p)%p); fflush(stdout);
	return 0;
}

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值