赛时
T1 想如果某一行和某一列的最大值相同的话,这个数的位置就可以确定了,但如果一个数只作为某一行的最大值出现了一次,那它所在的列就一定有一个比它大的,所以考虑从大到小往矩形里放数,记录有几列已经放过数字了,那这个数就可以在这几列中任选一列,即 \(ans\) 乘上放过数的列的个数,赛时还记录了这一行已经放了几个数,并减去,有点神经,因为一行只有一个最大值,之前一定没有访问过这一行,所以减去的一定是 \(0\) ,对答案没什么影响。最后,如果一个数没有作为最大值出现,就只能放在行列都放过数的空位,即 \(ans\) 乘上( (放过数字的行数*列数)-比它大的数)。写的第一版就一下子过了所有样例,我人直接傻眼了(寻思今天也不是大吉呀),此时比赛开始一个多小时。
T2 思考了好一会儿,但没什么头绪,就先写了全排列的暴搜和 \(k=1\) 的情况,然后想着可以写个 \(dfs\) ,记录当前在哪个点,哪些点下一步必须走,哪些点还可以再等一步,如果必须走的点超过 \(1\) 个就 \(retuen\) ,这样走的情况会少很多,但并没有调过小样例。
T3打的暴力但是挂了。
T4有点复杂,没看。
赛后
T2正解是状压+记搜,jsy还证明了一下这样做复杂度是 \(O(n^2 2^7)\) 。
如果没有必走的点的话,下一步不一定要走还可以再等一步的点,我赛时少考虑这种情况了。
T3正解是 \(trie\)树+根号分治。
T4是一堆性质。