博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[BZOJ4361]isn(DP+容斥+树状数组)
阅读量:5240 次
发布时间:2019-06-14

本文共 1286 字,大约阅读时间需要 4 分钟。

先用树状数组求出g[i]表示长度为i的不降子序列个数。$O(n^2\log n)$

容斥,最终序列长度为i的方案数为g[i]*(n-i)!,但这里多计算了在删得只剩i个数之前就已经构成不降子序列的情况。

这时考虑最后是从哪个不降子序列删掉一个数的,g[i+1]*(n-i-1)!*(i+1),这里显然不会重复斥掉方案。

1 #include
2 #include
3 #include
4 #define rep(i,l,r) for (int i=(l); i<=(r); i++) 5 typedef long long ll; 6 using namespace std; 7 8 const int N=2010,mod=1e9+7; 9 int n,ans,a[N],b[N],fac[N],c[N][N],f[N][N],g[N];10 void add(int c[],int x,int k){ for (; x<=n; x+=x&-x) c[x]=(c[x]+k)%mod; }11 int que(int c[],int x){ int res=0; for (; x; x-=x&-x) res=(res+c[x])%mod; return res; }12 13 int main(){14 freopen("bzoj4361.in","r",stdin);15 freopen("bzoj4361.out","w",stdout);16 scanf("%d",&n);17 rep(i,1,n) scanf("%d",&a[i]),b[i]=a[i];18 sort(b+1,b+n+1);19 rep(i,1,n) a[i]=lower_bound(b+1,b+n+1,a[i])-b;20 fac[1]=1; rep(i,2,n) fac[i]=1ll*fac[i-1]*i%mod;21 add(c[0],1,1);22 rep(i,1,n) for (int j=i; j; j--)23 f[i][j]=(f[i][j]+que(c[j-1],a[i]))%mod,add(c[j],a[i],f[i][j]);24 rep(i,1,n) rep(j,i,n) g[i]=(g[i]+f[j][i])%mod;25 rep(i,1,n) ans=(ans+((1ll*fac[n-i]*g[i]%mod-1ll*fac[n-i-1]*g[i+1]%mod*(i+1)%mod)%mod+mod)%mod)%mod;26 printf("%d\n",ans);27 return 0;28 }

 

转载于:https://www.cnblogs.com/HocRiser/p/9907969.html

你可能感兴趣的文章
Cookie.js
查看>>
Django Blog学习笔记(一)
查看>>
什么是“堆”,"栈","堆栈","队列",它们的区别
查看>>
什么是lambda函数?它有什么好处?
查看>>
在线的IDE(Ideone)支持Java/Python/Go/D
查看>>
第4次作业
查看>>
hash 哈希
查看>>
淘宝的技术博客
查看>>
Linux commands
查看>>
JVM ,Java paper
查看>>
https://www.callicoder.com/java-8-completablefuture-tutorial/
查看>>
YARN Resource Management
查看>>
作业5:需求分析
查看>>
socket入门
查看>>
[工作中的设计模式]装饰模式decorator
查看>>
swift objective-c混编操作
查看>>
黑盒测试方法
查看>>
创建Java程序并设置快捷提示
查看>>
组合模式
查看>>
vim编辑强制执行命令
查看>>