0%

The 21st Hunan Provincial Collegiate Programming Contest——2025-湖南省赛-D. Box(不难注意到,只有在 3*3 的网格上,对角线操作才可以减少操作数量)

题目大意

题目描述
给定一个 n×mn \times m 的初始为空的网格,你可以进行以下两种操作:

  1. 选择一个格子 (x,y)(x, y),在其所在的整行和整列的所有空格子中放置小球。

  2. 选择一个格子 (x,y)(x, y),在经过该格子的两条对角线的所有空格子中放置小球。

image

即使一个格子中已经有小球,你依然可以选择该格子进行操作。
你需要求出填满整个网格所需的最少操作次数,并输出对应的具体操作方案。

输入格式
第一行为测试用例数量 TT1T1041 \le T \le 10^4)。
每个测试用例包含一行两个整数 n,mn, m1n,m1031 \le n, m \le 10^3),代表网格的行数和列数。
保证所有测试用例的 n×mn \times m 之和不超过 10610^6

输出格式
对于每个测试用例:
第一行输出最少操作次数 pp1pn×m1 \le p \le n \times m)。
随后 pp 行,每行输出三个整数 op,x,yop, x, y1xn,1ym1 \le x \le n, 1 \le y \le m),代表一次操作:

  • op=1op = 1 时,代表在格子 (x,y)(x, y) 进行行列的操作;

  • op=2op = 2 时,代表在格子 (x,y)(x, y) 进行对角线的操作。

样例数据

1
2
3
4
5
6
7
8
9
10
11
12
13
Input
2
3 4
2 2

Output
3
2 2 2
2 2 3
1 2 4
2
1 1 1
1 2 2

样例解释针对第一组测试数据(3×43 \times 4 的网格):
最少需要 33 次操作。输出提供的方案如下:

  • 11 次操作:2 2 2,对 (2,2)(2, 2) 使用对角线操作。

  • 22 次操作:2 2 3,对 (2,3)(2, 3) 使用对角线操作。

  • 33 次操作:1 2 4,对 (2,4)(2, 4) 使用行列操作。
    33 次操作结束后,整个 3×43 \times 4 的网格均会被小球覆盖。

针对第二组测试数据(2×22 \times 2 的网格):
最少需要 22 次操作。输出提供的方案如下:

  • 11 次操作:1 1 1,对 (1,1)(1, 1) 使用行列操作,此时第 11 行和第 11 列被填满。

  • 22 次操作:1 2 2,对 (2,2)(2, 2) 使用行列操作,此时第 22 行和第 22 列被填满。
    22 次操作结束后,全部 44 个格子均被填满。

思路讲解

赛时这个队友的这个思路,还是很厉害的。

不难注意到,只有在 3*3 的网格上,对角线操作才可以减少操作数量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void Solve() {
ll N, M;
cin >> N >> M;
ll opN = N, opM = M;
vector<array<ll,3>> ops;
for (int i = 1; i <= min(N, M); ++i) {
// 不难注意到,只有在 3*3 的网格上,对角线操作才可以减少操作数量
if (opN == 3 && opM == 3) {
// cout<<
ops.push_back({2,i+1,i+1});
ops.push_back({1,i+1,i+1});
break;
}
// cout << 1 << " " << i << " " << i << "\n";
ops.push_back({1,i,i});
opM--;
opN--;
}
cout<<SZ(ops)<<"\n";
for (auto [a,b,c]:ops) {
cout<<a<<" "<<b<<" "<<c<<"\n";
}
}

AC代码

AC
https://codeforces.com/gym/106139/submission/367213905

心路历程(WA,TLE,MLE……)