【2018/10/16】校內模擬賽
題一
題二
題三
題一分析
知識的不全面與遺忘
革命尚需努力
組合數常用三個公式:
------(1)
-------(2)
-------(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,自然溢位。