CT03 Contest#11 智商场 T2 unique

神秘构造体,没智商,真不会

题意

给一个 n,还有长度为 n 的序列 ai,bi。要求构造一个 n×n 的矩阵,每个位置的数可以是 [1,n2] 中的任意整数,并满足,第 i 行里面不同的种类数有 ai 个,第 i 列里面不同的种类数有 bi 个。

2ai,bin500

构造

构造的方法

首先在对角线上放一堆 1

然后在对角线循环右移一格的位置,即 (i,i%n+1) 的位置,依次放上 2,3...n+1。这个东西也是每行、列恰好一个,设每行、列的这个数分别是 pi,qi

枚举位置 (i,j) 。如果当前行、列都不行,放一个全新的颜色(从 n+2 开始数);如果行(hang)行(xing)列不行,那把 pi 放这;如果行不行,列行,放一个 qj;如果俩都行了,放一个 1

咋想到

去问了出题人 zzq 大爷,他说他啪的一下就会了,也不太清楚咋想到,我只能自己想了

大概都能想到,先搞一个base,然后做点小修改 (修正主义

我赛场上写了个爆搜打表,我注意到了 ai=bi=2 的情况,黑白染色即可。于是开始想,能不能先黑白染色,再改改。

但是这样的坏处在于:杂七杂八的几把玩意太多了,刚开始还能满足,后来越来越不能适应 a,b 的变化了

就好像某上个世纪解体的国家

对于构造题来说,我们一开始可以 放一些,不一定全放完,后面再调整

注意到 ai,bi2 的条件。我们一开始可以让每行、每列都恰好有两种,然后再加东西

trick:对于方阵的构造,我们可以考虑主对角线放一条,然后右边再放一条;这样可以解决很多行、列上的限制

另一个例题:CF1436B

其实有一个方法是,我们爆搜出来 n=3 的解,然后对着这些解,去思考是咋得到的,用手凑一凑;或者也可以直接凭脑子想。总之就是,我们发现我们需要做到下面几件事:

  • 放一个“无用元”:我们已经搞定了 a,b,但是格子还没填满,需要一些无影响的东西来当垃圾
  • 单加一行/一列:修改 (i,j) 位置,会同时影响第 i 行和第 j 列,但是我们只要搞其中一条,因为另一条已经好了
  • 同时加一行/一列:最sb的,直接放一个全新的颜色就行

“无用元”在一番思考过后,也很好搞:主对角线全放 1,然后接下来的所有位置放 1 都不再会有影响了,此时它就成为了一个 “无用元”

接下来是对于单行/列的修改:如果不考虑那个无用元,其实我们可以在主对角线上放 1,2,3...n。这样,比如我们要修改 (i,j) 位置,但只影响第 i 行,那在这放一个 j 就行了。第 j 列本来就有一个 j,再放一个 j 就不会影响了

那这两个东西都要用主对角线,咋办?其中一个东西让一让位置,整体循环+1,右移一格,就没事了。我们这里把后面那个东西挪了一下。同时,它的值也得平移一些:从 1,2...n 变成 2,3...n+1,因为那个 1 要去当 “无用元”

总结

  1. n×n 方阵中的构造方法,见上面
  2. 在方阵中考虑构造,尤其是行列间相互影响的,可以考虑如何单独影响其中一个
posted @   Flandre-Zhu  阅读(64)  评论(1编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示