题目链接

长度为\(i\)的不降子序列个数是可以DP求的。

用\(f[i][j]\)表示长度为\(i\),结尾元素为\(a_j\)的不降子序列个数。转移为\(f[i][j]=\sum f[i-1][k]\),其中\(k\)满足\(k<j\)且\(a_k\leq a_j\),可以用树状数组\(O(n^2\log n)\)解决。

那么长度为为\(i\)的不降子序列个数\(sum[i]=\sum_{j=i}^nf[i][j]\)。

比较麻烦的是得到不降序列后会立刻停止操作。如果没有这个限制,答案就是\(\sum_{i=1}^nsum[i]\times (n-i)!\)。

但是很简单的是,如果长为\(i\)的不降序列是由另一个不降序列继续删数得到的(即不合法的方案),那么这个方案数就是\(sum[i+1]\times (i+1)\times (n-i+1)!\)。

对每个\(i\)减掉不合法方案的贡献就可以了,即\(Ans=\sum_{i=1}^nsum[i]\times (n-i)!-sum[i+1]\times (i+1)\times (n-i+1)!\)。

  1. //32268kb 1256ms
  2. #include <cstdio>
  3. #include <cctype>
  4. #include <cstring>
  5. #include <algorithm>
  6. #define gc() getchar()
  7. #define mod 1000000007
  8. #define Mod(x) x>=mod&&(x-=mod)
  9. typedef long long LL;
  10. const int N=2005;
  11. int fac[N],A[N],ref[N],f[N][N],g[N];
  12. struct Bit
  13. {
  14. int n,t[N];
  15. #define lb(x) (x&-x)
  16. inline void Add(int p,int v)
  17. {
  18. for(; p<=n; p+=lb(p)) t[p]+=v, Mod(t[p]);
  19. }
  20. inline int Query(int p)
  21. {
  22. LL res=0;
  23. for(; p; p^=lb(p)) res+=t[p];
  24. return res%mod;
  25. }
  26. }T[N];
  27. inline int read()
  28. {
  29. int now=0;register char c=gc();
  30. for(;!isdigit(c);c=gc());
  31. for(;isdigit(c);now=now*10+c-'0',c=gc());
  32. return now;
  33. }
  34. inline int Find(int x,int r)
  35. {
  36. int l=1,mid;
  37. while(l<r)
  38. if(ref[mid=l+r>>1]<x) l=mid+1;
  39. else r=mid;
  40. return l;
  41. }
  42. int main()
  43. {
  44. int n=read(),mx=0;
  45. fac[0]=fac[1]=1;
  46. for(int i=2; i<=n; ++i) fac[i]=1ll*fac[i-1]*i%mod;
  47. for(int i=1; i<=n; ++i) ref[i]=A[i]=read();
  48. std::sort(ref+1,ref+1+n); int cnt=1;
  49. for(int i=2; i<=n; ++i) if(ref[i]!=ref[i-1]) ref[++cnt]=ref[i];
  50. for(int i=1; i<=n; ++i) mx=std::max(mx,A[i]=Find(A[i],cnt));
  51. for(int i=1; i<=n; ++i) f[1][i]=1;
  52. for(int i=2; i<=n; ++i)
  53. {
  54. T[i-1].n=mx, T[i-1].Add(A[i-1],f[i-1][i-1]);
  55. for(int j=i; j<=n; ++j)
  56. f[i][j]=T[i-1].Query(A[j]), T[i-1].Add(A[j],f[i-1][j]);
  57. }
  58. for(int i=1; i<=n; ++i)
  59. {
  60. LL sum=0;
  61. for(int j=i; j<=n; ++j) sum+=f[i][j];
  62. g[i]=1ll*sum%mod*fac[n-i]%mod;
  63. }
  64. LL ans=0;
  65. for(int i=1; i<=n; ++i) ans+=g[i]-1ll*g[i+1]*(i+1)%mod;
  66. printf("%lld\n",(ans%mod+mod)%mod);
  67. return 0;
  68. }

BZOJ.4361.isn(DP 树状数组 容斥)的更多相关文章

  1. BZOJ 4361 isn | DP 树状数组

    链接 BZOJ 4361 题面 给出一个长度为n的序列A(A1,A2...AN).如果序列A不是非降的,你必须从中删去一个数, 这一操作,直到A非降为止.求有多少种不同的操作方案,答案模10^9+7. ...

  2. bzoj4361 isn (dp+树状数组+容斥)

    我们先设f[i][j]表示长度为i,以j结尾的不降子序列个数,$f[i][j]=\sum{f[i-1][k]},A[k]<=A[j],k<j$,用树状数组优化一下可以$O(n^2logn) ...

  3. 【BZOJ 4361】 4361: isn (DP+树状数组+容斥)

    4361: isn Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 218  Solved: 126 Description 给出一个长度为n的序列A( ...

  4. 【BZOJ4361】isn 动态规划+树状数组+容斥

    [BZOJ4361]isn Description 给出一个长度为n的序列A(A1,A2...AN).如果序列A不是非降的,你必须从中删去一个数, 这一操作,直到A非降为止.求有多少种不同的操作方案, ...

  5. bzoj 1264 [AHOI2006]基因匹配Match(DP+树状数组)

    1264: [AHOI2006]基因匹配Match Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 793  Solved: 503[Submit][S ...

  6. 树形DP+树状数组 HDU 5877 Weak Pair

    //树形DP+树状数组 HDU 5877 Weak Pair // 思路:用树状数组每次加k/a[i],每个节点ans+=Sum(a[i]) 表示每次加大于等于a[i]的值 // 这道题要离散化 #i ...

  7. 【bzoj2274】[Usaco2011 Feb]Generic Cow Protests dp+树状数组

    题目描述 Farmer John's N (1 <= N <= 100,000) cows are lined up in a row andnumbered 1..N. The cows ...

  8. 奶牛抗议 DP 树状数组

    奶牛抗议 DP 树状数组 USACO的题太猛了 容易想到\(DP\),设\(f[i]\)表示为在第\(i\)位时方案数,转移方程: \[ f[i]=\sum f[j]\;(j< i,sum[i] ...

  9. BZOJ 4361 isn 容斥+dp+树状数组

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4361 题意概述: 给出一个长度为N的序列A(A1,A2...AN).如果序列A不是非降的 ...

随机推荐

  1. Getting started with machine learning in Python

    Getting started with machine learning in Python Machine learning is a field that uses algorithms to ...

  2. python动态函数名的研究

    所谓动态函数名,就是使用时完全不知道是叫什么名字,可以由用户输入那种. 一般人习惯性会想到eval或exec, 但是众所周知,这样的写法不安全而且容易引起问题,而且不pythonic.而且使用时必须把 ...

  3. Lucas卢卡斯定理

    当$p$为素数时 $$C_n^m\equiv C_{n/p}^{m/p}*C_{n\%p}^{m\%p}(mod\ p)$$ 设$n=s*p+q,m\equiv t*p+r(q,r<=p)$ 我 ...

  4. java linux ftp问题

    java写的ftp上传类,本地测试环境可以用,阿里云服务器不可用,两者系统均为centos.经过测试,发现appche的ftpclient类不可用,换成sun的ftpclient可以使用.

  5. 转载:为什么选择Nginx(1.2)《深入理解Nginx》(陶辉)

    原文:https://book.2cto.com/201304/19610.html 为什么选择Nginx?因为它具有以下特点: (1)更快 这表现在两个方面:一方面,在正常情况下,单次请求会得到更快 ...

  6. 14-jQuery补充

    jquery内容补充 jquery除了咱们上面讲解的常用知识点之外,还有jquery 插件.jqueryUI知识点 jqueryUI 官网: https://jqueryui.com/ jqueryU ...

  7. Linux C 结构体初始化三种形式

    最近看linux代码时发现了结构体 struct 一种新的初始化方式,各方查找对比后总结如下: 1. 顺序初始化教科书上讲C语言结构体初始化是按照顺序方式来讲的,没有涉及到乱序的方式.顺序初始化str ...

  8. php中类继承和接口继承的对比

    PHP类继承: 1.PHP类不支持多继承,也就是子类只能继承一个父类,但是支持多层次继承,比如: class frist{ public function __construct(){ echo &q ...

  9. 性能测试十一:jmeter进阶之java请求

    使用Java编写JDBC脚本对Mysql进行增删改查等操作的性能测试 使用Jmeter提供的脚本框架依赖的jar包(分别在jmeter目录下的lib和ext目录下) ApacheJMeter_core ...

  10. ASP.NET Global.asax详解【转】

    global.asax是一个文本文件,它提供全局可用代码.这些代码包括应用程序的事件处理程序以及会话事件.方法和静态变量.有时该文件也被称为应用程序文件. global.asax 文件中的任何代码都是 ...