U401797 [THUWC2024]小C的矩阵

题目背景

小 C 有一个 $n×m$ 的 $01$ 矩阵,保证其中至少有一个位置的数 $1$ ,你要寻找其中最靠近 $(n,m)$ 的那个,即你需要找到位置 $(x,y)$ ,满足 $a_{x,y}=1$ 的同时 $x+y$ 最大 这是一道交互题,这道题目的矩阵是在调用你的程序前就被交互库生成并不再改变的,即交互库不会根据你的询问动态构造矩阵。 如果你的询问均合法且次数不超过次数上限,保证此时交互库的耗时的总时间不超过 $0.1s$ ,消耗的总内存不超过 $100MiB$ 。 请不要使用 `#program` 命令等攻击交互库或探测搜索交互库内部变量,否则后果自负。

题目描述

你可以使用 `Ask` 函数询问某个子矩形中是否含有 $1$ 。 ```cpp Ask(int l ,int r ,int u ,int v) ``` 你需要保证 $1\le l \le r \le n,1\le u \le v \le m$ ,表示你要询问第 $l$ 行到第 $r$ 行,第 $u$ 列到第 $v$ 列的子矩阵中是否有 $1$ ,若有返回 $1$ ,若无返回 $0$ 。 其计算方法为: $$\left[\sum_{l\le x \le r,u\le y \le v}a_{x,y}>0\right]$$ 当然你的询问是有一些限制的,比如询问次数 $s_1$ 和询问规模 $s_2$ 。如果你的询问次数超过 $10^6$ ,小C会直接拒绝回答你的询问并判定答案错误。 其中 $s_2=\sum max(r-l+1,v-u+1)$ 。 你不需要也不应修改交互器,只需要在下发文件中修改 Solve 函数的文件即可。你不需要也不应实现主函数,也不应有任何输出。 交互库会调用恰好一次 `Solve` 函数 ```cpp Solve(int n ,int m ,int id) ``` 其中 $id$ 代表子任务编号,若是样例则为 $0$ 。

输入格式

第一行 $3$ 个整数, $n,m$ 和 $id$ 接下来是一个 $n$ 行 $m$ 列的 $01$ 矩阵

输出格式

返回最大的 $x+y$

说明/提示

| 子任务编号 | 分值 | $n=$ | $m=$ | | :----------: | :----------: | :----------: | :----------: | | $1$ | $4$ | $2$ | $2$ | | $2$ | $20$ | $1$ | $4096$ | | $3$ | $76$ | $4096$ | $4096$ | 每个子任务的评分标准如下: 如果你的 `Solve` 函数调用的 `Ask` 均合法且不超过 $10^6$ 次,而且返回了正确的答案,则该子任务得分为 $s_1$ 对应的分值与 $s_2$ 对应的分值之和,否则该子任务得分为 $0$ 。 对于子任务 $1$ : | $s_1\in$ | 分值 | $s_2\in$ | 分值 | | :----------: | :----------: | :----------: | :----------: | | $(3,+\infty)$ | $0$ | $(4,+\infty)$ | $0$ | | $(2,3]$ | $1$ | $(3,4]$ | $1$ | | $[0,2]$ | $2$ | $[0,3]$ | $2$ | 对于子任务 $2$ : | $s_1\in$ | 分值 | $s_2\in$ | 分值 | | :----------: | :----------: | :----------: | :----------: | | $(24,+\infty)$ | $0$ | $(8192,+\infty)$ | $0$ | | $(15,24]$ | $2$ | $(4100,8192]$ | $3$ | | $(13,15]$ | $5$ | $(4096,4100]$ | $7$ | | $(12,13]$ | $7$ | $(4095,4096]$ | $10$ | | $[0,12]$ | $8$ | $[0,4095]$ | $12$ | 对于子任务 $3$ : | $s_1\in$ | 分值 | $s_2\in$ | 分值 | | :----------: | :----------: | :----------: | :----------: | | $(10^6,+\infty)$ | $0$ | $(10^9,+\infty)$ | $0$ | | $(2×10^5,10^6]$ | $2$ | $(10^7,10^9]$ | $2$ | | $(10^5,2×10^5]$ | $6$ | $(2×10^6,10^7]$ | $7$ | | $(2×10^4,10^5]$ | $10$ | $(10^6,2×10^6]$ | $15$ | | $(10^4,2×10^4]$ | $13$ | $(5×10^5,10^6]$ | $20$ | | $(8300,10^4]$ | $16$ | $(2×10^5,5×10^5]$ | $27$ | | $(8200,8300]$ | $18$ | $(10^5,2×10^5]$ | $45$ | | $(8192,8200]$ | $19$ | $(7.4×10^4,10^5]$ | $54$ | | $[0,8192]$ | $20$ | $[0,7.4×10^4]$ | $56$ | ### 样例解释 一种可能的你的程序与交互库在调用你的程序之后的运行情况: | 你的程序 | 交互库 | 说明 | | :----------: | :----------: | :----------: | | 调用 $Ask(2,3,2,3)$ | 返回 $1$ | $a_{2,2}+a_{2,3}+a_{3,2}+a_{3,3}=1$ | | 调用 $Ask(3,3,2,3)$ | 返回 $0$ | $a_{3,2}+a_{3,3}=0$ | | 调用 $Ask(2,2,3,3)$ | 返回 $1$ | $a_{2,3}=1$ | | 返回 $5$ | 打印 $Correct,s1=3,s2=5$ | 回答正确 | ### 提示 在本地调试时可使用题目下发的 simulator.cpp ,其使用方法如下 先在目录下打开终端编译: `` g++ simulator.cpp -o simulator -g -std=c++14 -O2 `` 其中````代表你的程序文件 然后在终端运行``simulator``并输入数据即可 为了让选手们更好的答题,选手们应在**模版代码**的基础上进行恰当的修改得到提交的**答案代码** ```cpp #include extern "C" { extern bool Ask(int l , int r , int u , int v); extern int Solve(int n , int m , int id); } int Solve(int n , int m , int id){ // 请开始你的表演 return ; } /* 以下代码为调用Ask函数的实例 int Solve(int n , int m , int id){ if(Ask(1,n,1,m)) return n+m; return n+m-1; } */ ``` #### 民间版本,感谢 PKU 的 [jun头吉吉](https://www.luogu.com.cn/user/174304)。