BZOJ4361: isn

BZOJ4361: isn

https://www.lydsy.com/JudgeOnline/problem.php?id=4361

Sol.

最终的状态一定是一个不降子序列。

令f[i][j]表示长度为i,最后一个数为a[j]不降子序列个数。

那么有f[i][j]=f[i-1][k](k<=j&&a[k]<=a[j]) 树状数组优化转移。

考虑g[i]= f[i][1..n]

g[i]×(ni)! 就是i的答案。

然而这样会重,有可能还没删完就不降了

方案数要减去g[i+1]*(i+1)  相当于g[i+1]乘上枚举最后删的点:i+1种

复制代码
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#define maxn 2005
#define mod 1000000007
#define ll long long
using namespace std;
int n,a[maxn],A[maxn],cnt;
ll h[maxn],f[maxn][maxn],g[maxn],tr[maxn];
map<int,int>ls;
ll ask(int x){
    ll sum=0;for(int i=x;i;i-=i&-i)(sum+=tr[i])%=mod;return sum;
}
void add(int x,ll v){
    for(int i=x;i<=cnt;i+=i&-i)(tr[i]+=v)%=mod;
}
void lsh(){
    sort(A+1,A+n+1);
    for(int i=1;i<=n;i++)if(!ls[A[i]])ls[A[i]]=++cnt;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)scanf("%d",&a[i]),A[i]=a[i];
    lsh();
    for(int i=1;i<=n;i++)a[i]=ls[a[i]];
    h[0]=1;for(int i=1;i<=n;i++)h[i]=1LL*h[i-1]*i%mod;
    for(int i=1;i<=n;i++)f[1][i]=1;
    for(int j=2;j<=n;j++){
        for(int i=1;i<=n;i++){
            (f[j][i]+=ask(a[i]))%=mod;
            add(a[i],f[j-1][i]);
        }
        for(int i=1;i<=cnt;i++)tr[i]=0;
    }
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)g[i]=(g[i]+f[i][j])%mod;
    ll ans=0;
    for(int i=1;i<=n;i++)g[i]=g[i]*h[n-i]%mod;
    for(int i=1;i<=n;i++)ans=(ans+g[i]-g[i+1]*(i+1))%mod;
    ans=(ans%mod+mod)%mod;
    cout<<ans<<endl;
    return 0;
}
复制代码

 

posted @   liankewei123456  阅读(163)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2018-11-07 无序字母对 character
点击右上角即可分享
微信分享提示