拉胡尔和蒂娜期待着在大学开始新的一年。当他们走进新教室时,他们发现学生的座位被排列成一个 n×m 网格。位于第 r 行和第 c 列的座位用 (r,c) 表示,两个座位 (a,b) 和 (c,d) 之间的距离是 |a−c|+|b−d| 。
作为班长,蒂娜可以用 k 桶粉色颜料。下面的过程是
- 首先,蒂娜在教室里选择 k 个座位涂上粉色颜料。一桶颜料正好可以涂一个座位。
- 当蒂娜在上一步涂完 k 个座位后,拉胡尔选择他的座位。由于讨厌粉色,他不会选择涂了粉色的座位。
- 拉胡尔选好座位后,蒂娜为自己选座位。她可以选择拉胡尔所选座位以外的任何一个座位,无论是否涂了粉色。
拉胡尔想选一个离蒂娜越近越好的座位。然而,蒂娜却想坐在离拉胡尔越远越好的位置上,因为她和拉胡尔之间有一些复杂的关系史,我们无法将其写入陈述中!
现在,拉胡尔想知道 k=0,1,…,n⋅m−1 ,如果蒂娜有 k 桶油漆,如果拉胡尔和蒂娜都知道对方的意图,并且他们都尽可能有策略地行动,拉胡尔可以坐在离蒂娜多近的地方?请帮助满足拉胡尔的好奇心!
输入
输入由多个测试用例组成。第一行包含一个整数 t ( 1≤t≤5⋅104 ) - 测试用例的数量。测试用例说明如下。
每个测试用例的第一行包含两个整数 n , m ( 2≤n⋅m≤105 ) --教室里座位的行数和列数。
所有测试用例中 n⋅m 的总和不超过 105 。
输出
对于每个测试用例,输出 n⋅m 个有序整数–如果拉胡尔和蒂娜在每个 k∈[0,n⋅m−1] 中都以最佳方式行动,则拉胡尔和蒂娜之间的距离。
很容易发现,拉胡尔肯定是会去选择尽量靠中间的位置,因为这样能够尽可能保证距离四个角最近,而蒂娜又一定会去选择四个角的位置,因为这样能够距离拉胡尔最远。
那么只需要与处理出来每个点对应的离自己最短的角落的距离,然后存储后进行排序,这样循环输出k次,因为每次填上一个就一定会导致距离增加,而双方绝顶聪明的话就一定能够保证当前最优解。
#include<bits/stdc++.h>
using namespace std;
void solve(){
int n,m;
cin >> n >> m;
vector<int>dis;
for(int i = 0;i < n;i++){
for(int j = 0;j < m;j++){
dis.push_back(max(i,n - i -1) + max(j,m - j - 1));
}
}
sort(dis.begin(),dis.end());
for(int k = 0;k < n*m;k++)cout << dis[k] << " ";
puts("");
}
int main(){
int T;cin >> T;
while(T--){
solve();
}
return 0;
}