P3352-[ZJOI2016]线段树【dp】
正題
題目鏈接:https://www.luogu.com.cn/problem/P3352
題目大意
nnn個數字的一個序列,每次隨機選擇一個區間讓這個區間所有數等于這個區間的最大值,重復qqq次,對每個位置求所有情況下這個位置的值的和。
1≤n,q≤4001\leq n,q\leq 4001≤n,q≤400,保證數據隨機
解題思路
設fk,l,rf_{k,l,r}fk,l,r?表示使用了kkk次目前覆蓋了極大區間l,rl,rl,r時的方案。
這個極大區間就是無法繼續向左右擴展(就是左右兩邊是邊界或者比這個區間內所有數都大),不然相同的方案會統計入不同的數組導致算重。
然后每次我們找一個數字開始向左右擴展到極大區間進行dpdpdp,然后dpdpdp方程是
fk,l,r=fk?1,l,r×gl,r+∑i=Ll?1fk?1,i,r+∑i=r+1Rfk?1,l,i+1f_{k,l,r}=f_{k-1,l,r}\times g_{l,r}+\sum_{i=L}^{l-1}f_{k-1,i,r}+\sum_{i=r+1}^{R}f_{k-1,l,i+1}fk,l,r?=fk?1,l,r?×gl,r?+i=L∑l?1?fk?1,i,r?+i=r+1∑R?fk?1,l,i+1?
也就是固定端點的情況下擴展極大區間,因為是反過來的所以這樣是對的。
然后記錄一個dpdpdp數組ansi,jans_{i,j}ansi,j?表示數字iii至少為第jjj小的情況數,這個每次dpdpdp后都可以統計。
上面每個dpdpdp區間相當于笛卡爾樹上的區間,因為數據隨機,所以每個位置只會計算logloglog次。
時間復雜度O(nq2+n3)O(nq^2+n^3)O(nq2+n3)
code
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=410,P=1e9+7; ll n,q,a[N],b[N],rk[N],f[2][N][N],ans[N][N],cnt[N]; void solve(ll x,ll L,ll R){for(ll i=L;i<=R;i++)for(ll j=i;j<=R;j++)f[0][i][j]=f[1][i][j]=0;f[0][L][R]=1;for(ll k=1;k<=q;k++){for(ll i=L;i<=R;i++)for(ll j=i;j<=R;j++)f[k&1][i][j]=f[~k&1][i][j]*(cnt[j-i+1]+cnt[i-1]+cnt[n-j]);for(ll i=L;i<=R;i++){ll buf=0;for(ll j=R;j>=i;j--){(f[k&1][i][j]+=buf)%=P;(buf+=f[~k&1][i][j]*(n-j))%=P;}}for(ll j=L;j<=R;j++){ll buf=0;for(ll i=L;i<=j;i++){(f[k&1][i][j]+=buf)%=P;(buf+=f[~k&1][i][j]*(i-1))%=P;}}}for(ll i=L;i<=R;i++){ll buf=0;for(ll j=R;j>=i;j--){(buf+=f[q&1][i][j])%=P;(ans[j][rk[x]]+=buf)%=P;}}return; } signed main() {scanf("%lld%lld",&n,&q);for(ll i=1;i<=n;i++)cnt[i]=i*(i+1)/2; for(ll i=1;i<=n;i++){scanf("%lld",&a[i]);b[i]=a[i];}sort(b+1,b+1+n);ll m=unique(b+1,b+1+n)-b-1;for(ll i=1;i<=n;i++)rk[i]=lower_bound(b+1,b+1+m,a[i])-b;for(ll i=1;i<=n;i++){ll L=i,R=i;while(L>1&&a[L-1]<a[i])L--;while(R<n&&a[R+1]<a[i])R++;solve(i,L,R);}for(ll i=1;i<=n;i++){ll sum=0;for(ll j=1;j<=n;j++){if(!ans[i][j]){continue;}for(ll k=1;k<j;k++)(ans[i][j]+=P-ans[i][k])%=P;(sum+=ans[i][j]*b[j]%P)%=P;}printf("%lld ",sum);}return 0; }總結
以上是生活随笔為你收集整理的P3352-[ZJOI2016]线段树【dp】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: P7295-[USACO21JAN]Pa
- 下一篇: P6177-Count on a tre