1. 程式人生 > 實用技巧 >「雜項」NOIP 2020 - 賽後總結

「雜項」NOIP 2020 - 賽後總結

不是特別想說傷心的事情。

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 的準備了。

再見,明年再見。