1. 程式人生 > >FOJ有獎月賽-2010年12月

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表示每個狀態的平均合法後繼狀態數)