「雜項」NOIP 2020 - 賽後總結
阿新 • • 發佈:2020-12-05
不是特別想說傷心的事情。
T1 一遍過完所有大樣例,此時只過去了十幾二十分鐘,不過之前花了半個小時通讀了整個 PDF 所以此時大概過了 1h。
T2 大概花了十幾分鍾胡出了一個反著列舉就是正解的 n^2 暴力。
又花了一個多小時寫出了一個能過第一個小樣例的 150 行垃圾。
然後,就沒有然後了。
後面三個小時全部除錯去了。
大概可以從這裡看到我考場思路的經過
//T1:給你n個點,其中m個沒有入度,接受. //沒有出度為終點.問,每個終點最終的水量. //先考慮直接模擬. //找出m(m很小)個起點,然後,dfs. //Beware of your long long //過完dyl了,記得最後15min檢查long long // //T2:資料範圍大概1e5+5e4的樣子。 //先考慮一個暴力。 //C是一定在最後的,我們考慮從後往前列舉C。 //然後看前面的迴圈的個數,設前面的迴圈節為SS。 //那麼就有(|S|-|C|)/(|SS|)個基迴圈節。 //裡面隨便劃分兩個字串分別做A,B,方案數為|S|-1。 //然後我們可以用基迴圈節再組成一些新的迴圈節,這個要看(|S|-|C|)/(|SS|)的因數個數。 //但是我們需要滿足F(A)<=F(C)。 //這個我們每次統計一遍即可。 //但是但是 //如何找迴圈節? //找出來了。 //然後,我們把迴圈節中所有字首(不含空串)的F值找出來,計為funa[j],1<=j<i。 //然後把(|S|-|C|)/(|SS|)的因數分解出來,計為ps[k],然後就計算funa[j]*ps[k]<=F(C)的情況有多少種,但是時間複雜度好像退化le,好像沒有,。算了先打。 //哦對了我們可以把funa排個序,用單調性來優化成O(n^2*log)應該能過一半左右。(funa本身不具有單調性。) // //思路比較亂,重新整理一下如何計算答案。 //設當前的C=S[i,n]。 //列舉的字首A=S[1,j],B=S[j+1,i-1](不關心) //設M=(|S|-|C|)/(|SS|),即基迴圈節=SS一共有多少節。 //設P(M)表示M的某一個因數。 //如果當前的F(A)<=F(C),那麼對於P(M)為奇數的情況,我們用P(M)個SS可以重新組成又一個迴圈節。 //列舉一個j in [1,i-2],來計算答案。 //這裡相當於把我們當前的S[1,i-1]分成了M段,看當前我們列舉的j在哪一段。 //設在第x段,如果x|M,那麼ans+=M/x;否則ans++。 //計算當前在哪一段: //法1:用變數 //法2:算 //恩,dyl沒過。初步判斷是算漏了,不存在算重的問題。 //不好像也有算多了。。。1 //大概知道哪裡有問題了。 //當|SS|=1時,一個迴圈節裡不知道怎麼擺B。 //需要特判,當|SS|=1,不算基迴圈節的貢獻。 //不過我答案是少了阿。。。 //還是不行。 // // //3 //nnrnnr //zzzaab //mmlmmlo
現場發明了一個不用 KMP 線性求迴圈節的方法(苦笑)。
lps[len] = mps[1]; // how to work the "loop day (xun huan jie)" out // open an array to store the LD // then (for j=2 to i-1), t o "beautiful orange (mei ju)" the prefix // cur means currently we where we should match (under S LD meaning) // len means the length of the LD // lst means the previous fail matched position // when we "lost match (shi pei)" we then add S[lst,j] into the LD // then put lst into zero,put cur into one // when finish 1 round matching (cur==len+1), we should: // 1. change cur into 1 // 2. change lst into j+1 // remember to special check if the (|S|-|C|)/(|SS|) isn't in Z situation for ( int j = 2; j < i; ++ j ) { if ( mps[j] != lps[cur] ) { cur = 1; for ( int k = lst; k <= j; ++ k ) lps[++ len] = mps[k]; lst = j + 1; } else { cur ++; if ( cur == len + 1 ) cur = 1; } // oneDebug ( j, cur, lst, len ); } if ( ( i - 1 ) % len ) { len = i - 1; for ( int j = 1; j <= len; ++ j ) lps[j] = mps[j]; }
中式英語令人愁。
中午大家一起吃飯的時候發現 T1 題讀錯了。
發現 T2 列舉 A 或者倒著列舉 C 咱就是對的呢。
SyadouHayami 說我 CCF 系列的比賽考一次炸一次。
我倒覺得不一定就是考得炸了,也許只是單純的菜而已。
並不想寫什麼深刻的思考,這樣反而不像我。
只是想說,沒有辦法,只能這樣了。
已經做好聽從 GM、ZSL、MOM、LF 的指令 go back 的準備了。
再見,明年再見。