1. 程式人生 > >【2018/10/16】校內模擬賽

【2018/10/16】校內模擬賽

題一

題二

題三

 

題一分析

知識的不全面與遺忘

革命尚需努力

組合數常用三個公式:

\binom{n}{m}=\binom{n}{n-m}               ------(1)

\binom{n}{m}=\binom{n-1}{m}+\binom{n-1}{m-1}           -------(2)

\binom{n}{0}+\binom{n}{1}+\binom{n}{2}+....+\binom{n}{n}=2^{n}    -------(3)

預處理組合數

利用楊輝三角形,也就是性質2

	for(int i=0;i<=n;++i) c[i][0]=c[i][i]=1;
	for(int i=2;i<=n;++i)
		for(int j=1;j<i;++j)
			c[i][j]=(c[i-1][j]+c[i-1][j-1])%P;

求解逆元

由於這道題的模數是1e9+7,是個質數,所以我們可以用費馬小定理求解

但要是模數不為質數,且a與mod互質,就可以用擴充套件歐幾里得求解

當然當資料範圍在可以承受之內的時候,我們也可以線性求解

更詳細的看這裡

 

題二分析

由題可知,每個點的入度只能也必須為 1 ,出度>=0

那這很顯然就是一個環套樹,當然也可能存在多個環套樹

所以我們要求解的就是一個環套樹森林

因為要求代價最小,所以我們可以利用類似Kruskal演算法的思想,邊權最小的邊一定是屬於最優方案的

就按邊權從小到大加邊,維護環套樹森林

怎麼維護環套樹森林呢?

如果現在加入的這條邊的兩個端點:u,v

這兩個端點,一個屬於樹,一個在環裡,顯然選這條邊後,原圖仍是一個環

一個屬於環,另一個也屬於環,顯然這條邊是不能選的(否則就不滿足入度為1了)

一個屬於樹,另一個在另一個樹裡,選了過後,仍是一顆樹

兩個同屬一顆樹,則現在這棵樹會變成一個環

用並查集維護一下當前這一坨是屬於樹還是環即可

 

題三分析

沒有注意資料範圍的提示,每個節點膜拜的長者都是節點號在它之前的啊

又是一道主席樹……主席樹真是厲害了,感覺無所不能,所向披靡

其實考場上也想過雜湊,但不知道為什麼居然沒有深入進行思考

由於比較的話,1e5長度的串還有1e5個,自然不可能直接搞

所以現在我們的瓶頸就是如何快速比較兩個串的大小,由於每次只會修改和膜拜的長者之間的一個字母

這種每次和之前的狀態都只有一小部分不同的,我們就可以思考一下主席樹

我們就可以想到雜湊二分的方法。其實就是不斷的詢問字串的某一部分的雜湊值。

我們可以用線段樹來維護雜湊值,那麼每次修改一個位置只需要把父親的線段樹改一個位置。 就又可以利用主席樹來維護,比較的時候也從主席樹的兩個根開始遞迴比較,可以做到 O(nlog2n)

還有一點用hash的話最好用unsigned long long,自然溢位。