聯合宣講 Maximum or Sum

2021-10-05 17:30:44 字數 1631 閱讀 4095

給定長為 n m 1 的陣列 。定義正整數陣列 合法,當且僅當它長為

n ,且對任意 i 都有 max(ai, ai+1) = ci 或者 ai + ai+1 = ci 。

求合法 的個數。

n ≤ 3 × 103

令 di = min(ci 1, ci) ,有 ai ∈ [1, di] 。

我們從前往後去確定 ai 的值,可以發現 ai 與 ci 是否相等會對 ai+1 產生兩種完全不同的影響。

若 ai = ci ,這時 ai+1 只會受到 [1, di+1] 的取值範圍限制。

若 ai = ci ,這時在取值範圍的限制下,必須有以下兩者之一

ai+1 = ci

ai+1 = ci ai

初步設 fi 表示 ai = ci 時,a 的取值方案數;gi 表示所有 ai = ci的情況下,a 的取值方案數之和。

如果能寫出轉移式,最終答案就是 f1 + g1 。

根據之前的性質推導,我們有

若滿足 ci = di , 取 ai = ci ,有 fi+1 + gi+1 → fi • 用 [l, r] 表示 ai = ci 時,ai 的取值範圍,ai+1 所對應的取值範圍就應該是[l′ = ci r, r′ = ci l] ∩ [1, di+1] ,而且是 ai+1 決定 ai 1 若滿足 ci = di+1 ,取 ai+1 = ci ,有 fi+1 → gi 2 把 ci = di+1 的情況在 [l′, r′] 中除去,有 ai+1 取值 [l′, r′] 時,a 的取值方案數之和 → gi

可以發現圈 2 與原問題的模式非常相似,於是傳參 [l, r] 遞迴求解即可。

#include

using

namespace std;

const

int n =

3030

;const

int mo =

1e9+7;

int f[2]

[n],l[2]

[n],r[2]

[n],c[n]

,cnt[n]

;int

main()

int nowr =0;

for(

int j =

1; j <= cnt[cur]

; j++)}

if(nowr < c[i]-1

) cnt[ne]++;

l[ne]

[cnt[ne]

]= r[ne]

[cnt[ne]

]= c[i]

; f[ne]

[cnt[ne]

]= sum % mo;

cur = ne;

}int ans =0;

for(

int i =

1; i <= cnt[1]

; i++

)(ans +

=1ll

* f[1]

[i]*

(r[1

][i]

- l[1]

[i]+1)

% mo)

%= mo;

printf

("%d\n"

,ans);}

}

ACM競賽宣講

或許有人還不清楚這個比賽有什麼用。那我告訴你們,參加這個比賽,可以讓你期末 c 的成績 90分以上,讓你熟悉c與 c 語言,虐殺各種 c 實驗。經過兩個月的集訓,你可以在三分鐘內完成計算機二級 c語言機試,然後在監考驚訝的目光中瀟灑離開,深藏功與名。你也可以提前和下學期將要學習的資料結構,以及大二上...

開心的宣講之行

宣講會結束,基本過關。而能夠和同事們好好休息個半天。而在的士中的對話相信我很長時間都難以忘記,因為很愜意和放送,和sdm與同事間毫無距離。黑色地帶 與 人頭符號 的戲言讓我們樂個不停。而午夜來到綠茵閣來吃飯也是氣氛與平時格外不同。我的田雞飯和同事的飯得到廚師們格外的關照 鹽分特足,除這點外還是吃得津...

宣講會 策劃雜談

用時 一般 1小時到3小時左右 要看 所用場地 預計來人數量 天氣等 注意宣講會時間很重要 乙個暴風雨後是韓流天氣是很難舉辦一場熱鬧的宣講會的,選擇時間一定要以聽講的人的心理去想。例如大學中 周一到周五 來的人會多 晚上6 00就比中午 要好 中午有要比 上下午好 除非你確定各個院系那個時間都沒課 ...