只过了样例1和4求条
查看原帖
只过了样例1和4求条
578029
ivyjiao楼主2024/11/23 10:59

这真的是蓝题吗……

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=501,M=1e6+1,p=1e9+7;
int n,m,a[N],ls[N],rs[N],st[N],l,sz[N],dp[N][N],g[N][N],fac[M]={1,1},inv[M]={1,1};
void getsz(int x){
    sz[x]=1;
    if(ls[x]) getsz(ls[x]),sz[x]+=sz[ls[x]];
    if(rs[x]) getsz(rs[x]),sz[x]+=sz[rs[x]];
}
int A(int n,int m){
    if(m>n) return 0;
    return fac[n]*inv[n-m]%p;
}
int f(int n,int m,int k){
    return A(n,k)*A(m,k)%p*inv[k]%p;
}
void dfs(int u,int low){
    int w=a[u]-low;
    if(!ls[u]&&!rs[u]){
        for(int i=1;i<=m;i++) dp[u][i]=f(w,sz[u],i);
        return;
    }
    if(!ls[u]||!rs[u]){
        int v=(ls[u]?ls[u]:rs[u]);
        dfs(v,a[u]);
        for(int i=1;i<=m;i++) for(int j=0;j<=i;j++) (g[u][i]+=dp[0][j]*dp[v][i-j])%=p;
        for(int i=1;i<=m;i++) for(int j=0;j<=i;j++) (dp[u][i]+=g[u][j]*f(w,sz[u]-j,i-j))%=p;
        return;
    }
    dfs(ls[u],a[u]);
    dfs(rs[u],a[u]);
    for(int i=1;i<=m;i++) for(int j=0;j<=i;j++) (g[u][i]+=dp[ls[u]][j]*dp[rs[u]][i-j])%=p;
    for(int i=1;i<=m;i++) for(int j=0;j<=i;j++) (dp[u][i]+=g[u][j]*f(w,sz[u]-j,i-j))%=p;
}
signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++){
        int r=l;
        while(l&&a[st[l]]>a[i]) l--;
        if(l) rs[st[l]]=i;
        if(l<r) ls[i]=st[l+1];
        st[++l]=i;
    }
    getsz(st[1]);
    for(int i=2;i<M;i++) fac[i]=fac[i-1]*i%p;
    for(int i=2;i<M;i++) inv[i]=(p-p/i)*inv[p%i]%p;
    for(int i=2;i<M;i++) inv[i]=inv[i]*inv[i-1]%p;
    for(int i=1;i<=n;i++) dp[i][0]=g[i][0]=1;
    dfs(st[1],0);
    cout<<dp[st[1]][m];
}
2024/11/23 10:59
加载中...