CF1179E Alesya and Discrete Math

题目描述

我们称一个函数是“好”的,如果它的定义域是某个整数集合,并且当它在 $x$ 和 $x-1$ 上都有定义时,满足 $f(x) = f(x-1) + 1$ 或 $f(x) = f(x-1)$。 Tanya 找到了 $n$ 个“好”函数 $f_{1}, \ldots, f_{n}$,它们在所有从 $0$ 到 $10^{18}$ 的整数上都有定义,并且 $f_i(0) = 0$,$f_i(10^{18}) = L$,对所有 $1 \leq i \leq n$ 都成立。巧合的是,$n$ 是 $L$ 的约数。 她向 Alesya 提出了一个游戏。Alesya 每次可以询问 Tanya 某个函数在某个点的值。为了获胜,Alesya 需要为每个函数选择整数 $l_{i}$ 和 $r_{i}$($0 \leq l_{i} \leq r_{i} \leq 10^{18}$),使得对于所有 $1 \leq i \leq n$,都有 $f_{i}(r_{i}) - f_{i}(l_{i}) \geq \frac{L}{n}$(这里 $f_i(x)$ 表示第 $i$ 个函数在点 $x$ 的值),并且任意两个函数的区间 $[l_i, r_i]$ 互不相交(但可以有一个公共点)。 不幸的是,Tanya 不允许询问次数超过 $2 \cdot 10^{5}$。请帮助 Alesya 获胜! 可以证明,总是存在满足上述条件的 $[l_i, r_i]$ 的选择。 保证 Tanya 在游戏过程中不会更改函数,即交互器是非自适应的。

输入格式

第一行包含两个整数 $n$ 和 $L$($1 \leq n \leq 1000$,$1 \leq L \leq 10^{18}$,$n$ 是 $L$ 的约数),表示函数的数量以及它们在 $10^{18}$ 处的值。

输出格式

当你找到所需的 $l_i, r_i$ 后,先在单独一行输出一个感叹号 "!",然后输出 $n$ 行,第 $i$ 行包含两个用空格分隔的整数 $l_i$ 和 $r_i$。 # 交互说明 要询问 $f_i(x)$,请输出问号 "?",然后输出两个整数 $i$ 和 $x$($1 \leq i \leq n$,$0 \leq x \leq 10^{18}$)。注意,输出后必须刷新缓冲区以获得响应。 之后,你应读取一个整数,表示第 $i$ 个函数在点 $x$ 的值。 最多允许 $2 \cdot 10^5$ 次询问。 刷新缓冲区的方法(在输出整数和换行后立即执行): - C++:fflush(stdout) - Java:System.out.flush() - Python:stdout.flush() - Pascal:flush(output) - 其它语言请参考相关文档。 # Hack 数据格式 仅允许 $1 \leq L \leq 2000$ 的测试数据。Hack 数据格式如下: 第一行包含两个整数 $n$ 和 $L$($1 \leq n \leq 1000$,$1 \leq L \leq 2000$,$n$ 是 $L$ 的约数),表示函数数量和 $10^{18}$ 处的值。 接下来的 $n$ 行,每行包含 $L$ 个数 $l_1, l_2, \ldots, l_L$($0 \leq l_j < 10^{18}$,$1 \leq j \leq L$,且 $l_j < l_{j+1}$),在第 $i$ 行中,$l_j$ 表示 $f_i(l_j) < f_i(l_j + 1)$。

说明/提示

在样例中,Tanya 有 $5$ 个相同的函数,$f(0) = 0$,$f(1) = 1$,$f(2) = 2$,$f(3) = 3$,$f(4) = 4$,其余所有点的值均为 $5$。 Alesya 需要为每个函数选择两个整数,使得函数在这两个点的值之差不少于 $\frac{L}{n}$(此处为 $1$),且各自的区间长度没有重叠。 一种可行的方式是为第 $1,2,3,4,5$ 个函数分别选择区间 $[0, 1]$、$[1, 2]$、$[2, 3]$、$[3, 4]$ 和 $[4, 5]$。 由 ChatGPT 4.1 翻译