题解 CF1624FInteracdive Problem

Posted rui_er 的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解 CF1624FInteracdive Problem相关的知识,希望对你有一定的参考价值。

CF1624F。

显然 \\(10\\approx\\log_210^3\\),因此可以盲猜二分(

正经一点,每次询问后我们就知道了 \\(\\lfloor\\fracxn\\rfloor\\),另外 \\(n\\) 在一开始给出,我们就只需要知道 \\(x\\bmod n\\) 了。

假设我们知道 \\(x\\bmod n\\) 在区间 \\([l,r)\\) 中(显然初始时 \\(l=0,r=n\\)),我们需要知道它到底在 \\(m=\\lfloor\\fracl+r2\\rfloor\\) 的哪一边。令 \\(k=n-m\\),我们可以使 \\(x\\gets x+k\\),这样如果余数在 \\([l,m)\\),那么商数不会变,否则会增加一。利用这个性质,我们就可以二分出余数,从而求出 \\(x\\) 的值了。

实现的时候跟上面有一点不同,但总体思路差不多,可以参考一下:

//By: Luogu@rui_er(122461)
#include <bits/stdc++.h>
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define per(x,y,z) for(int x=y;x>=z;x--)
#define debug printf("Running %s on line %d...\\n",__FUNCTION__,__LINE__)
#define fileIO(s) dofreopen(s".in","r",stdin);freopen(s".out","w",stdout);while(false)
using namespace std;
typedef long long ll;

int n;
template<typename T> void chkmin(T& x, T y) if(x > y) x = y;
template<typename T> void chkmax(T& x, T y) if(x < y) x = y;
int ask(int x) 
	printf("+ %d\\n", x);
	fflush(stdout);
	scanf("%d", &x);
	return x;

void give(int x) 
	printf("! %d\\n", x);
	fflush(stdout);


int main() 
	scanf("%d", &n);
	int L = 1, R = n;
	while(L + 1 < R) 
		int M = (L + R) >> 1;
		int diff = n - M % n;
		if(ask(diff) == (L + diff) / n) R = M;
		else L = M;
		L += diff; R += diff;
	
	give(L);
	return 0;

本文来自博客园,作者:rui_er,转载请与作者联系并注明原文链接:https://www.cnblogs.com/ruierqwq/p/CF-1624F.html

以上是关于题解 CF1624FInteracdive Problem的主要内容,如果未能解决你的问题,请参考以下文章

代码源 Div1 - 109#454. Minimum Or Spanning Tree(最小生成树,边权按位或,贪心,并查集) CF1624G

CF1512D Corrupted Array 题解

题解CF519E

题解-比赛CF1332

CF398B题解

CF1354&CF1355 简要题解