Codeforces Round #619 (Div. 2) D. Time to Run 矩阵回路构造
傳送門
文章目錄
- 題意:
- 思路:
題意:
給你一個n?mn*mn?m的矩陣,每兩個相鄰點之間有個雙向邊,問你能不能走滿kkk步,每一步走的邊不同,但是點可以相同,換句話說就是走的邊不能再走了。輸出的時候輸出一個fff和一串不超過444個的字符,表示按照這個字符走fff次。輸出的行數(shù)不能超過300030003000行。
思路:
能看出來這是個歐拉回路,每個點度數(shù)為偶數(shù),一定有解,所以先判斷一下是否≤(4?n?m?2?n?2?m)\le (4*n*m-2*n-2*m)≤(4?n?m?2?n?2?m)。
判斷有解后,我們考慮如何構造解。
一開始我想的是先走完一行和一列,讓后將問題轉(zhuǎn)換成(n?1)?(n?1)(n-1)*(n-1)(n?1)?(n?1)的子問題,但是這顯然是不行的,因為從111出發(fā),想要每個邊走一遍,那么終點一定在111號點,所以考慮其他構造方法。
由于我們有300030003000的限制,所以我們不能隨便構造,下面介紹一個非常簡單就能實現(xiàn)的構造方法:
(1)(1)(1)先走m?1m-1m?1步到最右邊。
(2)(2)(2)向下走n?1n-1n?1步到最下邊。
(3)(3)(3)向上走n?1n-1n?1步回到剛才的點。
(4)(4)(4)向左走一步。
(5)(5)(5)重復(2),(3),(4)(2),(3),(4)(2),(3),(4),一直回到起點111。
(6)(6)(6)向下走一步。
(7)(7)(7)向右走m?1m-1m?1步。
(8)(8)(8)向左走m?1m-1m?1步。
(9)(9)(9)重復(6),(7),(8)(6),(7),(8)(6),(7),(8),一直到最下面的點。
(10)(10)(10)向上走n?1n-1n?1步。
這個方案的總次數(shù)上限是6?n6*n6?n,當然達不到上限,正好是300030003000,所以可行。
當然我們還有更好的構造方法。
考慮題目說的字符串不超過444個,所以利用這個性質(zhì)考慮優(yōu)化。
可以發(fā)現(xiàn),我們上面(2),(3)(2),(3)(2),(3)步是一直走到底,我們考慮只往下走一個位置,再向上走一個位置,再向左走一個位置,這個操作字符是DULDULDUL,我們執(zhí)行n?1n-1n?1次即可。每一行都可以這樣做。但是最后一行只能先RRR再LLL,因為他下面沒有行了。
第二種的實現(xiàn)細節(jié)很多,就懶得寫了。
總結
以上是生活随笔為你收集整理的Codeforces Round #619 (Div. 2) D. Time to Run 矩阵回路构造的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Network 黑暗爆炸 - 3732
- 下一篇: Codeforces Round #61