賽時
T1 想如果某一行和某一列的最大值相同的話,這個數的位置就可以確定了,但如果一個數只作為某一行的最大值出現了一次,那它所在的列就一定有一個比它大的,所以考慮從大到小往矩形裡放數,記錄有幾列已經放過數字了,那這個數就可以在這幾列中任選一列,即 \(ans\) 乘上放過數的列的個數,賽時還記錄了這一行已經放了幾個數,並減去,有點神經,因為一行只有一個最大值,之前一定沒有訪問過這一行,所以減去的一定是 \(0\) ,對答案沒什麼影響。最後,如果一個數沒有作為最大值出現,就只能放在行列都放過數的空位,即 \(ans\) 乘上( (放過數字的行數*列數)-比它大的數)。寫的第一版就一下子過了所有樣例,我人直接傻眼了(尋思今天也不是大吉呀),此時比賽開始一個多小時。
T2 思考了好一會兒,但沒什麼頭緒,就先寫了全排列的暴搜和 \(k=1\) 的情況,然後想著可以寫個 \(dfs\) ,記錄當前在哪個點,哪些點下一步必須走,哪些點還可以再等一步,如果必須走的點超過 \(1\) 個就 \(retuen\) ,這樣走的情況會少很多,但並沒有調過小樣例。
T3打的暴力但是掛了。
T4有點複雜,沒看。
賽後
T2正解是狀壓+記搜,jsy還證明了一下這樣做複雜度是 \(O(n^2 2^7)\) 。
如果沒有必走的點的話,下一步不一定要走還可以再等一步的點,我賽時少考慮這種情況了。
T3正解是 \(trie\)樹+根號分治。
T4是一堆性質。