解題報告 JXOI2017 數列 DP

2022-04-07 09:42:04 字數 1979 閱讀 8717

給定乙個長度為 \(n\) 的整數數列 \(\\), 構造數列 \(\\), 滿足以下條件

求滿足上述條件的數列 \(\\) 的數量.

$ n \le 50,\ r_i \le 150$

計數題, 考慮 \(dp\).

設 \(f[i][l][r]\) 為 : 考慮到 \(a_i\), \(l\) 為 \(a_\) 中小於等於 \(a_i\) 的最大值, \(r\) 為 \(a_\) 中大於等於 \(a_i\) 的最小值時, 數列 \(\\) 的數量.

首先明確一點, 當 \(l\not=r\) 時, \(a_i\) 需滿足 \(a_i\not = l\) 且 \(a_i\not =r\). 因為若 \(a_i=l\) 且 \(l\not=r\), 那麼大於等於 \(a_i\) 的最小值就不是 \(r\) 而是 \(l\) 了, 不符合 \(dp\) 狀態的意義; 當 \(a_i=r\) 時同理. 這一點在等下轉移的時候會用到.

為了便於處理, 我們把 \(l=-inf\) 的情況和 \(r=inf\) 的情況分別設為 \(l=0\) 和 \(r=max\+1\).

列舉 \(l',r'\) 進行轉移, 三種情況分類討論.

先考慮邊界情況, 當 \(l'=r'=l\) 時, 表示 \(a_\) 的取值為 \(l\), 那麼 \(l'\) 和 \(r'\) 就與 \(a_\) 無關了, 那麼它可以取 \((l,min(r_i,r)\) 中的任一值, 轉移係數為 \(min(r_i,r-1)-l\). 當 \(l'=r'=r\) 時同理.

而當 \(l'=r'\) 並且 \(l'\not=l\), \(l'\not= r\) 時, 就表示 \(a_\) 的取值與 \(a_\) 一致, 即 \(l'=r'=a_i\), 列舉 \(a_i\) 的所有可能取值轉移即可, 係數為 \(1\).

當 \(l'\not=r'\) 時, \(l'\) 和 \(r'\) 中必有乙個等於 \(a_i\), 我們仍是列舉 \(a_i\) 所有可能的取值轉移即可, 係數為 \(1\).

最後統計答案的計算式如下.

\[ans=\sum_+1} f[n][l][r]*(r-1-l) + \sum_ f[n][k][k]

\]其中 \(r-1-l\) 表示的是 \(a_n\) 的所有可能取值.

#includetypedef long long ll;

using namespace std;

const int _=50+7;

const int __=150+7;

const ll mod=998244353;

int n,lim[_],inf;

ll f[_][__][__],ans;

void _pls(ll &x,ll y)

int main()

for(int i=1;i<=n;i++)

inf++;

for(int i=1;i<=lim[1];i++)

for(int i=2;i<=n;i++)

for(int l=0;l<=lim[i];l++)

for(int r=l;r<=inf;r++)

for(int k=l+1;k<=min(r-1,lim[i]);k++)

if(l&&l<=lim[i+1]) _pls(f[i+1][l][l],f[i][l][r]*(ll)(min(lim[i],r-1)-l)%mod);

if(r&&r<=lim[i+1]) _pls(f[i+1][r][r],f[i][l][r]*(ll)(min(lim[i],r-1)-l)%mod);

}for(int l=0;l<=lim[n];l++)

for(int r=0;r<=inf;r++)

if(l&&l==r) _pls(ans,f[n][l][r]);

else _pls(ans,f[n][l][r]*(ll)(min(lim[n],r-1)-l)%mod);

printf("%lld\n",ans);

return 0;

}

JXOI2017 加法題解

1 首先要想到貪心,若想要滿足最小數最大,那麼我們盡量選區間長度長的修改方法修改,這樣同是加a,但是長度長的加的更多,明顯比較優越。2 如何找到最大區間,我們可以在輸入後對其左端點排序 原因等會說 令最小的左端點排在前面,然後要用時再依次插入優先佇列,而優先佇列即是要用來將左端點滿足條件且最大區間排...

貪心 堆 樹狀陣列 JXOI2017 加法 題解

有乙個序列 和 m 個區間,你可以選 k個區間,選擇區間 l r 可以使 a 中的 l r 都加上 a 找出乙個方案使得 a中最小值最大。由於是求最小值的最大值,所以我們想到二分答案 mi d 這樣我們就知道序列中每個數還需要加多少次才能 mid 設第 i 個數的次數為 ti i 那麼接下來我們要做...

JXOI2017 顏色 線段樹求點對貢獻

可憐有乙個長度為 n 的正整數序列 ai,其中相同的正整數代表著相同的顏色。現在可憐覺得這個序列太長了,於是她決定選擇一些顏色把這些顏色的所有位置都刪去。刪除顏色 i 可以定義為把所有滿足 aj i 的位置 j 都從序列中刪去。然而有些時候刪去之後,整個序列變成了好幾段,可憐不喜歡這樣,於是她想要知...