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]
就是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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .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