#P2326. 「CCO 2018 Day2」Gradient Descent

「CCO 2018 Day2」Gradient Descent

题目描述

译自 Canadian Computing Olympiad 2018 Day 2 A Gradient Descent

Troy 要和你一起玩游戏,规则如下。

他有一个 RR 行 CC 列的棋盘。每行按从 11 到 RR 的顺序编号,每列按从 11 到 CC 的顺序编号。令第 pp 行第 qq 列的单元格为 (p,q)(p,q)。

现在给定 NN 个棋子(从 11 编号到 NN),第 ii 个棋子放置在 (Xi,Yi)(X_i,Y_i) 处,其中 1≤Xi≤R,1≤Yi≤C1\le X_i\le R,1\le Y_i\le C。同一格可能有多个棋子。Troy 可以在一秒内将一个棋子移动到与其上下或左右相邻的格子中。格子的分数就被 Troy 定义为将这 NN 个棋子挪到这个格子的秒数的最小值。

你要做的就是找棋盘中格子里的分数的最小值。但 Troy 不会告诉你 NN 的值和每个棋子的位置,你可以问 Troy 最多 KK 个问题:格子 (p,q)(p,q) 的分数。

交互方式

首先,读入三个整数 R,C,KR,C,K,分别代表整个棋盘的大小和程序最多能问多少个问题。

读入完这一行后,程序需要输出询问 (p,q)(p,q) 的分数(格式为 ? p q)到标准输出,每个询问输出一行。然后从标准输入中一个整数 ss,代表这个格子的分数。

一旦确定了棋盘中的格子的分数的最小值,程序应输出一行 ! Z 并终止,ZZ 代表最终结果。

在输出每一行后,都应刷新缓冲区:

  • C/C++:fflush(stdout) or cout << endl
  • Java:System.out.flush()
  • Pascal:flush(output)

如果您输出的格式有误,或者提出的问题超过了 KK 个,将返回答案错误。

对于每组测试数据,N,R,C,KN,R,C,K 和每个棋子的坐标在程序运行时都是固定的。也就是说,交互系统不是适应性的。

样例交互过程 1

向交互程序的请求 交互程序的响应
1 10 90\texttt{1 10 90}
? 1 3\texttt{? 1 3} 9\texttt{9}
? 1 7\texttt{? 1 7} 11\texttt{11}
? 1 4\texttt{? 1 4} 8\texttt{8}
! 8\texttt{! 8}

样例解释

在这个样例中,棋子放在 (1,2),(1,4),(1,10)(1,2),(1,4),(1,10)。保证测试中使用的样例与这个样例一致。

单元格 (1,3)(1,3) 的分数为 1+1+7=9 1 + 1 + 7 = 9。

单元格 (1,7)(1,7) 的分数为 5+3+3=115 + 3 + 3 = 11。

单元格 (1,4)(1,4) 的分数为 2+0+6=82 + 0 + 6 = 8,并且是分数最小的单元格。

这个样例中分数如下表:

列 1 2 3 4 5 6 7 8 9 10
分数 1313 1010 99 88 99 1010 1111 1212 1313 1414

样例交互过程 2

向交互程序的请求 交互程序的响应
5 4 170\texttt{5 4 170}
? 2 4\texttt{? 2 4} 11\texttt{11}
? 1 4\texttt{? 1 4} 15\texttt{15}
? 3 3\texttt{? 3 3} 7\texttt{7}
! 7\texttt{! 7}

样例解释

在这个样例中,棋子放在 (2,3),(2,3),(4,3),(5,1)(2,3),(2,3),(4,3),(5,1)。

数据范围与提示

对于 100%100\% 的数据,1≤R,C≤1071 \le R,C \le 10^7,1≤K≤1701 \le K \le 170,1≤p≤R1 \le p\le R,1≤q≤C1 \le q \le C,0≤s≤2×1090 \le s \le 2 \times 10^9,1≤N≤1001 \le N \le 100,1≤Xi≤R1 \le X_i \le R,1≤Yi≤C1 \le Y_i \le C。
对于 20%20\% 的数据,R=1R=1,C≤90C \le 90,K=90K=90。
对于另外 20%20\% 的数据,R=1R=1,K=90K=90。
对于另外 20%20\% 的数据,K=170K = 170。
对于另外 20%20\% 的数据,K=100K = 100。
对于另外 20%20\% 的数据,K=75K=75。