UNR9 D2T1 Sing
沖 T1 才是對的,T1 沒過寫 nm T2 啊。
給一種很劣的做法。
觀察到這個條件具有類支配性質,也就是說對于 \(i<j<k,p_i>p_j\),檢查二元組 \((j,k)\) 是不必要的,因為如果 \((j,k)\) 此時不合法,則 \((i,k)\) 也不合法。
所以考慮對前綴最大值進行 dp,設 \(f_{i,j}\) 代表前 \(i\) 個數已確定,第 \(i\) 個數為 \([1,i]\) 前綴最大值,值為 \(j\)。
轉移即先枚舉后面第一個比 \(p_i\) 大的值 \(p_l\)。
先討論 \(a\) 全是 \(0\) 的情況。對于一個前綴最大值 \(p_i\),它對后面的位置 \(pos\) 的限制形如若 \(pos\in (i,p_i-k)\),則 \(p_{pos}\le i+k\)。
如果 \(p_i-k-1>i\),則可以發現 \(l\notin (i,p_i-k)\),否則 \(p_l\le i+k<p_i-1\),與 \(p_l>p_i\) 矛盾。
所以此時 \(i\) 對 \(l\) 只存在 \(p_i<p_l\) 的限制,但是對于 \((i,l)\) 中的數呢?
對于 \(pos\in (i,p_i-k)\),存在 \(p_{pos}\le i+k<p_i-1\) 的限制,因此只要我們能直接獲取 \(\le i+k\) 的數的個數就好了。
相當好的是我們可以發現 \([1,i-1]\) 中不存在 \(>i+k\) 的數,如果存在這樣一個 \(pos<i\),則因為 \(p_{pos}>i+k\),有 \(p_i\le pos+k\),則 \(pos\ge p_i-k>i+1\),矛盾。
所以可以通過乘一個排列數描述轉移。
否則沒有任何限制,當然是簡單的了。
\(O(n^4)\) 的代碼形如這樣:
for(int i=1;i<=n;i++){
f[1][i]=1;
}
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
for(int l=i+1;l<=n;l++){
for(int m=j+1;m<=n;m++){
if(i<j-k-1){
int num=j-k-1-i,len=l-i-1;
if(l>=j-k){
Add(f[l][m],f[i][j]*A(k+1,num)%P*A(j-i-num,len-num)%P);
}
}
else{
int len=l-i-1;
Add(f[l][m],f[i][j]*A(j-i,len)%P);
}
}
}
}
}
ans=0;
for(int i=1;i<=n;i++){
int num=max(0,n-k-i-1),len=n-i;
int up=min(n-1,i+k);
ans+=f[i][n]*A(up-(i-1),num)%P*A(n-i-num,len-num)%P;
}
其中 A 是排列數。
稍微優化一下就是 \(O(n^2)\) 的了。
對于存在 \(a_i\neq 0\) 的情況就有點惡心,不過也可以類似優化的。
空間劣完了,不如 tybbs 線性空間;時間劣完了,不如官解可以多項式求逆。
難度約 ???,但我還是玩原神,沒有救了啊。
過去說的話還是太唐了。

浙公網安備 33010602011771號