IOI2020只因訓隊作業胡做

w a r n i n g ! 意 識 流 警 告 !!1

不想一個個發了,乾脆直接發個合集得了qwq

感覺這輩子都做不完了\(Q\omega Q\)

CF516D

寫過題解了

CF505E

寫過題解了*2

CF555E

首先對於一個邊雙,一定存在一種定向方案滿足任意兩點可達.那把邊雙縮點,原圖就變成了一棵樹,詢問的兩點路徑可以拆成一段往上走的鏈和一段往下走的,那麼就要使得若干鏈上的邊都往上或都往下,搞兩種差分數組統計一下,不合法當且僅當一條邊在兩種差分數組裏都有值

code

CF704B

JOISC郵戳拉力賽

題解先咕着

code

CF704C

將每個\((x_i|x_j)\)看成是一條邊\((i,j)\),那麼就可以得到一堆鏈或者是環(有可能是自環),每個連通塊顯然是獨立的,可以先求出每個連通塊的狀態,然後併到一個全局揹包裏去.那麼對於每個鏈就鏈上dp出每個子樹內異或和爲\(0/1\)的方案,轉移只要枚舉自己這個點的取值,然後類似揹包合併上一個點的dp值就行了;至於環上dp,因爲是個環,那就斷環爲鏈,dp出鏈的異或和爲\(0/1\)的方案,然後dp完鏈後考慮被斷掉的那條邊的貢獻.具體實現可能需要\(y\grave{i}\)點細節

code

CF521D

顯然三種操作之間應該先賦值,然後加,最後乘.然後對於一個數,賦值只需要取賦的值最大的一次操作,發現這樣可以把賦值改爲加操作.題目要求\(\prod x_i\)最大,取個對數後可以變成要\(\sum log\ x_i\)最大,乘法對於\(log\ x_i\)的貢獻量是不會變的,而加法操作顯然要先用大的再用小的,排序後可以用\(log(x_i\sum_{j=1}^{i}b_j)-log(x_i\sum_{j=1}^{i-1}b_j)\)算第\(i\)個加法操作的貢獻量.最後選出貢獻最大的\(k\)個操作就是答案,輸出注意三種操作之間的順序

code

CF512D

這題本質上還是個揹包.注意到這個遍歷過程相當於每次選一個度數爲1的點刪掉.如果一個連通塊是樹,那麼遍歷若干個點後一定會剩下一個子連通塊,那就可以換根dp出在樹上挖掉若干個點的方案數;如果連通塊上有若干個環,因爲環上的點是一定不能刪的,那麼只有掛在環上點外面的子樹,並且滿足子樹內有度數爲1的點的部分可以刪去(參考樣例3解釋的那個大連通塊,除了環上4個點都可以挖掉),那麼就對這些部分分開樹型揹包(這裏不需要換根,因爲根就是對應在環上的點).然後把一個dp過程中,以及合併答案過程中要乘上組合數(因爲兩個沒有子樹關係的部分是相互獨立的,他們的選點順序可以交錯開來)

code

CF575A

顯然要矩乘.這裏的話大概預處理一個倍增的矩陣,表示在第\(i\mod n\)項,往後轉移\(2^k\)步的轉移矩陣,每次就倍增轉移到下一個斷點,然後斷點處特殊轉移.複雜度爲\(O(8nlogk+8mlogk)\),其中\(8\)爲矩乘複雜度

code

CF547D

CF704D弱化版

我們對每個橫縱座標建點,然後一個點\((x,y)\)就給橫座標\(x\)和縱座標\(y\)連一條無向邊,然後給邊定向,如果是\(x\to y\)就是紅色,否則就是藍色.因爲某個座標上紅藍點數之差的絕對值要\(\le 1\),所以定向後要使得所有點入度和出度的差的絕對值要\(\le 1\).如果是強制入度等於出度,這實際上是一個歐拉回路,所以我們把所有度數爲奇數的點兩兩配對連邊,那麼就可以跑歐拉回路了,定向之後再把後面加進來的邊刪掉,這樣所有點入度出度都會滿足條件

code

CF536D

我們以\(s\)\(t\)爲起點,跑其他點到起點的最短路,然後就能得到對於這兩個點,按照最短路長度排序後的序列,現在問題變成有兩個序列,每次操作的一方要在之前選擇前綴的基礎上接着選擇一段,還要滿足這新的一段存在之前沒有被兩個人選到過的點,然後每個人用最優策略博弈.那就可以設\(f_{i,j}\)表示這次是先手操作,操作前兩個序列被選了前綴\(i\)\(j\)的最大權值,\(g_{i,j}\)表示的是後手,轉移直接枚舉這一次選到哪一個位置,然後用後面一段還沒被選的權值總和減去對應的\(f/g\)更新.注意到轉移的時候只有一維會變,所以可以對每一維記錄後綴最小值,即可做到\(O(n^2)\)

code

CF576D

最短路?\(n\le 150\)?考慮矩乘.用行向量維護某個時刻是否可以到達某個點,然後本質不同的轉移矩陣段只有\(O(m)\)個,所以在每一段先轉移\(n\)步,看能不能到點\(n\),然後剩下部分可以快速冪轉移.精細實現可以做到\(O(n^3mlog|V|)\).注意到矩陣是\(01\)矩陣,所以套個\(bitset\)可以得到\(\frac{1}{\omega}\)的常數優化

code

CF506E

考慮從兩邊往中間填,設\(f_{i,l,r}\)表示開頭結尾已經填了\(i\)次,然後整個串還有\([l,r]\)沒被填進去.每次填字符的時候,如果當前串左右兩邊能夠填就儘量填.最後轉移完如果最終長度爲偶數答案就是\(\sum f_{\frac{n+m}{2},i+1,i}\),如果是奇數就還要加上\(f_{\lfloor\frac{n+m}{2}\rfloor,i,i}\)(第\(i\)個字符在整個串最中間).這樣在套上一個矩乘,就可以做到6方\(log\)

考慮優化,首先可以發現轉移只有三種

  • 填的字符和\(s_l,s_r\)不同
  • 填的字符和\(s_l,s_r\)之中一個相同
  • 填的字符和\(s_l,s_r\)都相同

後面兩種轉移係數都是1.對於第一種轉移,如果\(s_l=s_r\),那麼還剩下\(25\)種字符可以填,否則還剩\(24\)種字符可以填.那麼轉移把第一種轉移先用矩乘預處理出來,然後對於\(f_{i,l,r}\)只用後兩種轉移,這樣貢獻答案時\(f\)的轉移係數就只和轉移過程中\(s_l=s_r\)以及\(s_l\neq s_r\)的個數有關.所以\(f\)多開一維表示\(s_l=s_r\)的情況個數.貢獻答案時假設是枚舉\(x\)\(s_l=s_r\),那\(s_l\neq s_r\)就假設有\(y\)個(並且\(y\)可以由\(x\)推出來).矩乘預處理第一種轉移時,可以看成是一張\(DAG\),上面有\(x+y+1\)個點依次連接,轉移係數爲\(1\),其中前\(x\)個點都會有係數爲\(24\)的自環,後\(y\)個點都會有係數爲\(25\)的自環,最後一個點有\(26\)的自環,然後要的是走若干步從第一個點到最後一個點的方案,這樣子就可以做到\(O(n^4log(n+m))\)

然而還是不能通過此題.我們考慮整\(n+\lceil\frac{n}{2}\rceil+\lceil\frac{n}{2}\rceil\)個點(實際上可能還要多幾個點,不過規模約爲這麼大),分別稱爲\(A,B,C\)類點,其中每個\(A\)類點有一個\(24\)的自環,每個\(B\)類點有一個\(25\)的自環,每個\(C\)類點有一個\(26\)的自環.然後所有\(A\)類點順次連接,後面接着連\(B\)類點,\(B\)類點同樣依次連接,每個\(B\)類點下再掛一個\(C\)類點(其中每條連接兩點的邊,轉移係數爲1),大概得到這樣的結構

一般我們矩乘都是行向量乘轉移矩陣.現在我們把表示狀態的行向量拓展,變成若干行向量,每一行表示從某個點\(A\)類點出發,到達其他點的方案,那麼只要一次矩乘快速冪,然後求第\(x\)\(A\)類點到第\(y\)\(C\)類點(或者是\(B\)類點)的方案就是矩陣上\(A\)類點對應的那一行,\(C\)類點(或\(B\)類點)對應的那一列的值.複雜度優化到\(O(n^3+n^3log(n+m))\)

code

CF516E

下面假裝有\(n\le m\).我們可以先做這個操作\(m\)次,這\(m\)次裏只要做有值的部分即可.那麼如果前\(m\)次操作中第\(i\)次操作使得上面的點\(x\)和下面的點\(y\)都被標記,那麼可以發現第\(i+m\)次操作會使得上面的\((x+m)\mod n\)點被標記,以及發現第\(i+n\)次操作會使得下面的\((y+n)\mod m\)點被標記,並且可以發現所有的操作影響都可以規約到上面兩種情況

進一步的,根據上面的操作,可以發現這兩個序列分別可以分成\(\gcd(n,m)\)個環,每個環互相獨立,就可以分開考慮了(注意環內每次操作相當於一般情況下\(\gcd(n,m)\)次操作,同時還要加上環內第一次操作爲一般情況下第幾次操作).如果一個環內沒有一個初始被標記的點,那就無解,否則一定有解

後面記\(n1=\frac{n}{\gcd(n,m)},m1=\frac{m}{\gcd(n,m)}\),這其實就是一個環內上下兩排的規模.然後在環內可以先進行\(m1\)次操作,這導致上面一排每個被標記的點\(x1\)每過\(m1\)次操作後標記\((x1+m1)\mod n1\)號點,和下面一排每個被標記的點\(y1\)每過\(n1\)次操作後標記\((y1+n1)\mod m1\)號點.統計時只需要記錄前面的操作中每個被標記的點最早操作的時間,然後對於上面一排,\(x1\)\((x1+m1)\mod n1\)連邊,再把剛剛標記的點放在環上,那麼每個點能標記的點都是這個點在環上往後到環上下一個點之前的一段,就對於每個這樣的段算出段上的點全被標記的最早時間,下面一排同理,接着一起取個\(\max\)就是這個環的貢獻.最後答案爲所有環貢獻的\(\max\)

高 級 口 胡 記 錄

code

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章