专栏文章
题解:P14592 [LNCPC 2025] 裂痕
P14592题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @min18lo3
- 此快照首次捕获于
- 2025/12/01 18:54 3 个月前
- 此快照最后确认于
- 2025/12/01 18:54 3 个月前
P14592 题解
题目思路
首先明确,MEX 只与数组中最小的未出现正整数有关,所以大于 MEX 的数字对 MEX 没有贡献。
所以我们尝试不用大于等于 MEX 的正整数构造矩阵,此时我们解题就要用到一个性质,那就是每行的 MEX 数组和每列的 MEX 数组都是一个排列。下面的思路会基于这个性质填充矩阵的每一个位置。
比如我们先考虑某一行,此时这一行对应的每一个位置,它所在的列的 MEX 一定也是一个排列。我们不妨设这一行的 MEX 为 ,第 个位置对应列的 MEX 为 ,分讨两种情况:
-
,这些位置一共有 个, 对应的为 ,而若要构造出这一行 MEX 为 ,必须要有 的每一个值,只需要把矩阵的这些位置的填充为 即可。
-
,这些位置对这一行的 MEX 没有用处,因为我们已经用 的位置构造出了这一行的 MEX,那么剩下的这些位置可以填充小于 的值。
上述的填充方法显然可以用于矩阵的每一行、每一列,只要我们把考虑某一行变为考虑某一列即可。这样我们重新考虑上面分讨的第二种情况,只需要此时这个位置填充的值小于 即可;而第一种情况可以推广为填充 。所以美观起见,第二种情况也可以这么填。
最后我们考虑全局,这个方法也是正确的。用题目里的信息表述的话,那么 。
然后就做完了。
题目代码
代码和上面讲解的唯一区别就是数组名换成了 和 ,两者结合着看不会影响理解。
CPP#include<iostream>
using namespace std;
int a[2005] , b[2005];
void solve()
{
int n;
cin >> n;
for(int i = 1 ; i <= n ; i++)
{
cin >> a[i];
}
for(int i = 1 ; i <= n ; i++)
{
cin >> b[i];
}
for(int i = 1 ; i <= n ; i++)
{
for(int j = 1 ; j <= n ; j++)
{
cout << min(a[i] , b[j]) - 1 << " \n" [j == n];
}
}
}
signed main()
{
int t;
cin >> t;
while(t--)
{
solve();
}
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...