省選模擬14

2022-09-20 23:30:16 字數 1782 閱讀 9495

考慮區間 \(dp\) , \(f_\) 表示刪完 \(l,r\) 這個區間的最大價值

考慮 \(l,r\) 在一次被刪掉

發現好的子串一定是前一段上公升,後一段下降

於是可以再開兩個 \(g_\) 表示以 \(l,r\) 分別為兩個端點中間剩下恰好遞增或遞減的最大價值

那麼可以列舉乙個最大值的位置轉移

\(l,r\) 不在一次被刪掉,可以列舉乙個斷點來轉移

因為可以不刪完,所以可以再開個 \(dp\) 解決

code#include#define int long long

#define rint signed

#define inf 0x3f3f3f3f3f3f3f3f

using namespace std;

inline int read()

while(ch>='0'&&ch<='9')

return x*f;

}int n,ans,u;

int a[410],v[410];

int f[410][410],g1[410][410],g2[410][410],f[410];

signed main()

for(int k=l;k<=r;k++) if(a[k]>=a[l]&&a[k]>=a[r]&&a[k]*2-a[l]-a[r]+1<=n) f[l][r]=max(f[l][r],g1[l][k]+g2[k][r]+v[a[k]*2-a[l]-a[r]+1]);

for(int k=l;k

只會暴力列舉出邊

設 \(f_i\) 表示長度為 \(i\) 的悅耳的旋律的個數

那麼 \(f_i=\prod\limits_^nv_i-\sum\limits_^\left \lfloor \frac \right \rfloor f_j\prod\limits_^v_k\)

就是考慮列舉最小的 \(border\) 進行轉移(如果有 \(border\) 那麼最小 \(border\) 的長度一定小於 \(\frac\) ),前面的和後面的一樣,中間的可以隨便選

設 \(s_i=\prod\limits_^iv_j\)

於是 \(f_i=s_i-\sum\limits_^ \right \rfloor}f_js_s_j^\)

發現可以分治 \(ntt\) 做

而且只需要計算 \([1,\frac]\) 的值,最後再 \(o(n)\) 算 \(f_n\)

code#include#define int long long

#define rint signed

#define mod 998244353

#define inf 0x3f3f3f3f3f3f3f3f

using namespace std;

inline int read()

while(ch>='0'&&ch<='9')

return x*f;

}int n,ans,len,l,inv;

int s[2097152],inv[2097152];

int f[2097152],g[2097152],r[2097152];

int a[2097152],b[2097152];

inline int qpow(int x,int k)

return res;

}inline void init(int len,int l)

inline void ntt(int a){

for(int i=0;i>1;d>=1) for(int i=0;i>1;solve(l,mid);

for(len=1,l=0;len

省選模擬14

t1 要求乙個類似尤拉迴路的東西 考慮其實就是將奇度數點兩兩配對,配對的代價為最短路長度,求最小代價 發現邊權的特殊性 2 i 有乙個很好的性質 sum limits 2 i 2 n 那麼最短路就都是最小生成樹上的路徑 只需要跑出最小生成樹,然後在樹上配對就行了 t2 神題owo 將 i,j i j...

省選模擬14

屬實這場考試是順了我的心意 考場200整,第二題掛掉了10分,第三題的暴力dp沒有想到.第一題不知道我咋了,竟然成功的剪掉了狀態然後切掉了 第二題期望資料是隨的,於是我打了個暴力,期望複雜度 mathcal 最劣複雜度 mathcal 第三題抓住了一點點性質,但是想偏了,於是只打了暴搜 區間dp,這...

省選模擬 14

老規矩,禮尚往來。我覺得題目的英文名字比中文名字好看一些,中文名字就乙個字,好 色 樂。題目要求不一定刪完,如果我們知道強制刪完每個區間的最大價值,剩下的操作就是乙個簡單的 n 2 dp。現在我們只需要求出來刪掉每個區間的最大價值。考慮區間dp。討論區間端點l,r是不是同時被刪去的。如果不是,那麼整...