FOJ有獎月賽-2010年12月
去做這套比賽完全是為了去膜拜福大核武,京潤後人,這套題幾乎都是他的神題,我表示壓力很大
題目地址http://acm.fzu.edu.cn/contest/index.php?cid=111
A:
題目描述:給定一個長為N的序列,求陣列中有多少最長遞增子序列
分析:首先我們利用樹狀陣列可以在nlogn時間內(注意起始要離散化)
求得以i為結束的最長長度,記為dp[i]=max(dp[j])+1 (j<i&&a[j]<a[i])
那麼有多少個怎麼算呢,直觀的一個想法就是設w[i]表示
w[i]=sigma(w[j])(dp[j]==dp[i]-1&&a[j]<a[i]) 起始他們是一層層來傳遞的
故存在一個自底向上的拓撲序,這裡的層是用長度來劃分的
於是這裡可以用一個非常猥瑣的辦法,這裡假定共有m層
我就用m顆平衡樹來維護,我們依次將資料加入,依次查詢即可
總的複雜度還是nlogn,額這題其實還可以有很多暴力的水法,比如強行構造拓撲序,用vector陣列存關係
(話說做完這個題,心裡萌生了想要自己編寫一套STL的想法,把一些常用資料結構都封裝起來
如果可能的話,這個計劃會從二月份開始實施)
B:
題目描述:給定A mod B=C 其中A C已知,求滿足條件的B的個數
分析:問題等價成求|A-C|%B==0那麼就是|A-C|的約數個數
Yn=X1^a1*X2^a2*…*Xn^an;Yn的約數個數等於(a1+1)(a2+1)…(an+1)利用組合數學可以解釋
複雜度O(sqrt(10^9))
C:
幾何神題,我是幾何盲,研究中。。。
D:
題目描述給定一個串,問有多少個'314'的子序列
定義L[i]表示[0,i]有多少個3,R[i]表示[i,n-1]有多少個4
然後線性掃描一遍即可
E:
又是幾何題,煩死啦
F:
題目描述:給定一個N 按照如下操作
(1)如果N=1,遊戲結束
(2)如果N為偶數,那麼N=N/2
(3)否則N=N-1
PH and XiaoBo輪流玩,誰不能玩誰輸
分析:資料規模也不是很大,模擬即可
G:
題目描述:給定一個無向圖,求有多少個最小生成樹
分析:由於邊比較少,故採用暴力列舉選取邊的辦法
判斷並統計MST的個數,總的複雜度20*2^20
H:
題目描述:若國王位置為(x,y)則周圍八格都是不安全的
給定n*m矩陣,要求擺放k個國王,求合法的方案數
分析:由於max(min(n,m))最多為10,我們可以利用這個資訊來描述狀態
那麼接下來就是方程的設計,這裡我把較大的設定成行,方程也是很直觀的設計
dp[i][j][k]表示前i行,放了j個國王,上一行的列狀態為k的方案數
在這裡預處理兩個東西w[i]表示i狀態包含的1的個數
v[i]容器儲存所有i後繼的合法狀態
之後暴力轉移即可 我的複雜度是O(max(1024*1024),n*m*2^m*ave)
(ave表示每個狀態的平均合法後繼狀態數)