1. 程式人生 > >Noip模擬1 2018/10/17

Noip模擬1 2018/10/17

T1: 序列(seq)
給定 N,A,B 構造一個長度為 N 的排列,使得:
排列長度為 N;
最長上升子序列長度為 A;
最長下降子序列長度為 B。
我們有 SPJ,有解任意給出一組,否則說明無解。

感覺挺好想的,只是有解的情況沒輸出“Yes”,心態爆炸
先考慮N=A*B的情況
那麼我們可以構造一個排列,有B個長度為A的上升子序列,滿足每個子序列遞減
在這麼構造的情況下,若 N > A

B N < A + B 1
N>A*B || N<A+B-1 ,則無解
若構造不滿,先做k1個長度為A的上升子序列,最後有k2個點遞減,多出來的添在 k + 1 k+1 k 1 + k 2 + 1 = B ) (k1+k2+1=B)
時間效率 O ( n t ) O(n*t)

T2:購物(sum)
visit_world 有一個商店,商店裡賣 N 個商品,第 i 個的價格為 a[i]我們稱一個正整數 K 是美妙的,當且僅當我們可以在商店裡選購若干個商品,使得價格之和落在區間 [K,2K] 中。
問:有多少個美妙的數。

orzJyc,辣雞Hz誤導
假設我們已經處理到 s u m sum s u m = j = 1 i a [ j ] sum=\sum_{j=1}^{i}a[j] ,滿足a[i]單調遞增),考慮a[i]的貢獻。
a [ i ] a[i] 有貢獻的為 ( a [ i ] + 1 ) 2 \frac {(a[i]+1)}{2} ,假如 ( a [ i ] + 1 ) 2 < = s u m \frac {(a[i]+1)}{2}<=sum ,那麼將 a [ i ] a[i] 接在 s u m sum 後面和之前不會有間隙,反之則說明從 s u m + 1 sum+1 ( a [ i ] + 1 ) 2 1 \frac {(a[i]+1)}{2}-1 之間永遠都取不到,取不到的部分記為p
那麼答案就成了 s u m = i = 1 n a [ j ] p sum=\sum_{i =1}^{n}a[j]-p
時間效率 O ( n log n ) O(n\log n)

T3:計數(count)
考慮一個 N 個節點的二叉樹,它的節點被標上了 1∼N 的編號. 並且,編號為 i 的節點在二叉樹的前序遍歷中恰好是第 i 個出現.
我們定義 Ai 表示編號為 i 的點在二叉樹的中序遍歷中出現的位置.
現在,給出 M 個限制條件,第 i 個限制條件給出了 u i , v i ui,vi ,表示 A u i < A v i Aui<Avi ,也即中序遍歷中 ui 在 vi 之前出現.
你需要計算有多少種不同的帶標號二叉樹滿足上述全部限制條件,答案對
1 0 9 + 7 10^9+7 取模.

此題20%卡特蘭數白送。
考慮dp
f [ i ] [ j ] f[i][j] 表示以 i i 為頭 j j 為結尾的子樹可能的情況
列舉一個 k ( i < = k < = j ) k (i<=k<=j) ,將 i , j i,j 分為兩個子樹,左子樹 i + 1 , k i+1,k ,右子樹 k + 1 , j k+1,j ,且左右子樹均滿足條件, f [ i ] [ j ] + = f [ i ] [ k ] f [ k + 1 ] [ j ] f[i][j]+=f[i][k]*f[k+1][j]
這樣子判斷效率為 n 4 n^4 ,考慮優化判斷過程
將條件 ( x , y ) (x,y) 對映到一個二維矩陣上,然後判斷 ( k + 1 , j ) ( i + 1 , j ) (k+1,j) 到 (i+1,j) 上有沒有不滿足的條件,矩陣字首和一下就好
時間效率 O ( n 3 t ) O(n^3*t)