U402145 THUWC Day1T3

题目描述

**这是一道交互题。** ## 题目描述 小 C 有一个 $n\times m$ 的 $01$ 矩阵 $A$,他想让小 R 猜一猜,矩阵中最接近 $(n,m)$ 的 $1$ 在哪里。 形式化地说,他想让小 R 猜出满足 $A_{i,j}=1$ 的最大的 $i+j$。小 C 保证了他的矩阵里至少有一个 $1$。 小 C 允许 小 R 询问他一个子矩阵内是否有 $1$。每次询问小 R 可以选定 $1\le u\le d\le n$,$1\le l\le r\le m$,小 C 将会告诉他 $\sum_{i=u}^d\sum_{j=l}^rA_{i,j}$ 是否非零。 小 C 不希望小 R 问他太多个问题,也不希望小 R 询问的子矩形过大。他决定统计小 R 的询问次数(记作 $C_1$),以及小 R 所有询问的 $\max(d-u+1,r-l+1)$ 之和(记作 $C_2$)。 你需要帮助小 R 问出满足 $A_{i,j}=1$ 的最大的 $i+j$,同时保证 $C_1,C_2$ 不超过小 C 的限制。当然,只要你的询问次数不超过 $10^6$,小 C 都会根据 $C_1,C_2$ 给出一部分的分数。如果你的询问次数超过 $10^6$,小 C 将会拒绝你之后的询问并直接判定你回答错误。 ## 实现细节 你不需要,也不应该实现主函数,你只需要实现如下函数: ```cpp extern "C" int Find (int n, int m, int id); ``` - $n,m$ 的含义如【题目描述】中所示,$id$ 表示该测试点所属的子任务标号。特别地,样例的子任务编号为 $0$。 - 你需要返回一个正整数表示满足 $A_{i,j}=1$ 的最大的 $i+j$。 你可以通过调用一下函数来和交互库进行交互: ```cpp extern "C" int Ask (int u, int d, int l, int r); ``` - $u,d,l,r$ 的含义如【题目描述】中所示,你需要保证 $1\le u\le d\le n$,$1\le l\le r\le m$。 - 该函数返回一个非负整数 $0$ 或 $1$,返回值为 $0$ 代表该子矩形中没有 $1$,返回值为 $1$ 代表该子矩形中有 $1$。 评测时,交互库会恰好调用 `Find` 一次。 本题保证所使用的矩阵再交互开始之前已经完全确定,不会根据和你的程序的交互过程动态构造,因此题目中的交互操作都是确定性的,你不需要关心这些操作再交互库中的具体实现。 ## 样例输入 ```plain 3 3 0 010 001 100 ``` ## 样例输出 ```plain Correct. C_1=3, C_2=4. ``` ## 样例解释 以下是一种可能的交互过程: | 选手程序 | 交互库 | 说明 | | :----------: | :----------: | :----------: | | | 调用 `Find(3, 3, 0)` | | | 调用 `Ask(2, 3, 2, 3)` | 返回 $1$ | $A_{2,2}+A_{2,3}+A_{3,2}+A_{3,3}=1>0$ | | 调用 `Ask(3, 3, 3, 3)` | 返回 $0$ | $A_{3,3}=0$ | | 调用 `Ask(2, 2, 2, 2)` | 返回 $0$ | $A_{2,2}=0$ | | 返回 $5$ | 输出 `Correct.` | $A_{2,3}=1$,$2+3=5$ | | | 输出 `C_1=3, C_2=4.` | 评分参数 $C_1=3$,$C_2=4$ |

输入格式

无

输出格式

无

说明/提示

代码模板: ```cpp extern "C" int Ask (int u, int d, int l, int r); extern "C" int Find (int N, int M, int id){ //write your code here } ``` 你的程序不需要包含 `matrix.h` 头文件。 ## 子任务 | 子任务编号 | 分值 | $n=$ | $m=$ | | :----------: | :----------: | :----------: | :----------: | | $1$ | $4$ | $2$ | $2$ | | $2$ | $20$ | $1$ | $4096$ | | $3$ | $76$ | $4096$ | $4096$ | ## 评分方式 对于每个子任务,该子任务得分为其中所有测试点得分的最小值。 对于所有测试点,若询问不符合要求或 $C_1>10^6$ 或答案不正确,得 $0$ 分。否则,将根据该测试点所属的子任务编号,按照评分参数 $C_1,C_2$ 分别给出分数 $s_1,s_2$,该测试点的最终得分为 $s_1+s_2$。 对于第一个子任务,$s_1,s_2$ 的计算方式如下: | $C_1\in$ | $s_1=$ | $C_2\in$ | $s_2=$ | | :----------: | :----------: | :----------: | :----------: | | $(3,+\infty)$ | $0$ | $(4,+\infty)$ | $0$ | | $(2,3]$ | $1$ | $(3,4]$ | $1$ | | $[0,2]$ | $2$ | $[0,3]$ | $2$ | 对于第二个子任务,$s_1,s_2$ 的计算方式如下: | $C_1\in$ | $s_1=$ | $C_2\in$ | $s_2=$ | | :----------: | :----------: | :----------: | :----------: | | $(4096,+\infty)$ | $0$ | $(10^6,+\infty)$ | $0$ | | $(2048,4096]$ | $2$ | $(10^5,10^6]$ | $1$ | | $(1024,2048]$ | $3$ | $(5\times10^4,10^5]$ | $2$ | | $(160,1024]$ | $4$ | $(2\times10^4,5\times10^4]$ | $3$ | | $(80,160]$ | $5$ | $(10^4,2\times10^4]$ | $5$ | | $(16,80]$ | $6$ | $(8192,10^4]$ | $7$ | | $(13,16]$ | $7$ | $(6144,8192]$ | $8$ | | $(12,13]$ | $8$ | $(4096,6144]$ | $9$ | | $[0,12]$ | $10$ | $[0,4096]$ | $10$ | 对于第三个子任务,$s_1,s_2$ 的计算方式如下: | $C_1\in$ | $s_1=$ | $C_2\in$ | $s_2=$ | | :----------: | :----------: | :----------: | :----------: | | $(10^6,+\infty)$ | $0$ | $(10^9,+\infty)$ | $0$ | | $(6\times10^5,10^6]$ | $4$ | $(4\times10^7,10^9]$ | $3$ | | $(3\times10^5,6\times10^5]$ | $6$ | $(1.7\times10^7,4\times10^7]$ | $5$ | | $(10^5,3\times10^5]$ | $7$ | $(2\times10^6,1.7\times10^7]$ | $7$ | | $(5\times10^4,10^5]$ | $9$ | $(10^6,2\times10^6]$ | $25$ | | $(3.5\times10^4,5\times10^4]$ | $10$ | $(3\times10^5,10^6]$ | $29$ | | $2\times10^4,3.5\times10^4$ | $13$ | $(2\times10^5,3\times10^5]$ | $31$ | | $(1.3\times10^4,2\times10^4]$ | $15$ | $(10^5,2\times10^5]$ | $36$ | | $(8300,1.3\times10^4]$ | $17$ | $(8\times10^4,10^5]$ | $46$ | | $(8192,8300]$ | $19$ | $(7.4\times10^4,8\times10^4]$ | $50$ | | $[0,8192]$| $20$ | $[0,7.4\times10^4]$ | $56$ |