【BZOJ4362】isn

题面

bzoj

题解

设\(f[i][j]\)表示当前在\(i\),长度为\(j\)的最长不降子序列有多少个

这个可以用树状数组\(n^2logn\)求出

设\(g[i]\)为长度为\(i\)的不降子序列的和

则\(g[i]=\sum_{j=1}^nf[j][i]\)

最后的答案乍一看是\((n-i)!\sum_{i=1}^ng[i]\)

但是因为我们取到非降就\(break\)

所以需要容斥一下

不难想到

\[ans_i=(n-i)!\sum_{i=1}^ng[i]-(n-i-1)!g[i+1]*(i+1)\\
Ans=\sum_{i=1}^nans_i
\]

代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <cmath>
  6. #include <algorithm>
  7. using namespace std;
  8. inline int gi() {
  9. register int data = 0, w = 1;
  10. register char ch = 0;
  11. while (!isdigit(ch) && ch != '-') ch = getchar();
  12. if (ch == '-') w = -1, ch = getchar();
  13. while (isdigit(ch)) data = 10 * data + ch - '0', ch = getchar();
  14. return w * data;
  15. }
  16. const int MAX_N = 2e3 + 5;
  17. const int Mod = 1e9 + 7;
  18. inline void pls(int &x, int y) { x += y; if (x >= Mod) x -= Mod; }
  19. inline int dec(int x, int y) { x -= y; if (x < 0) x += Mod; return x; }
  20. int N, a[MAX_N], f[MAX_N][MAX_N], c[MAX_N][MAX_N], g[MAX_N], fac[MAX_N];
  21. int X[MAX_N], cnt;
  22. inline int lb(int x) { return x & -x; }
  23. void add(int *bit, int x, int v) { while (x <= cnt) pls(bit[x], v), x += lb(x); }
  24. int sum(int *bit, int x) { int res = 0; while (x > 0) pls(res, bit[x]), x -= lb(x); return res; }
  25. int main () {
  26. N = gi(); for (int i = 1; i <= N; i++) X[++cnt] = a[i] = gi();
  27. sort(&X[1], &X[cnt + 1]); cnt = unique(&X[1], &X[cnt + 1]) - X - 1;
  28. for (int i = 1; i <= N; i++) a[i] = lower_bound(&X[1], &X[cnt + 1], a[i]) - X;
  29. add(c[0], 1, 1);
  30. for (int i = 1; i <= N; i++) {
  31. for (int j = N; j >= 1; j--) {
  32. f[i][j] = sum(c[j - 1], a[i]);
  33. add(c[j], a[i], f[i][j]);
  34. }
  35. }
  36. for (int i = 1; i <= N; i++)
  37. for (int j = i; j <= N; j++) pls(g[i], f[j][i]);
  38. fac[0] = 1;
  39. for (int i = 1; i <= N; i++) fac[i] = 1ll * fac[i - 1] * i % Mod;
  40. int ans = 0;
  41. for (int i = 1; i <= N; i++)
  42. pls(ans, dec(1ll * fac[N - i] * g[i] % Mod, 1ll * fac[N - i - 1] * g[i + 1] % Mod * (i + 1) % Mod));
  43. printf("%d\n", ans);
  44. return 0;
  45. }

【BZOJ4362】isn的更多相关文章

  1. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  2. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  3. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  4. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  5. 【调侃】IOC前世今生

    前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...

  6. Python高手之路【三】python基础之函数

    基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...

  7. Python高手之路【一】初识python

    Python简介 1:Python的创始人 Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种解释型.面向对象.动态数据类型的高级程序设计语言,由荷兰人Guido ...

  8. 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】

    说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...

  9. 【原】FMDB源码阅读(二)

    [原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...

随机推荐

  1. 在CentOS7上安装和使用ZooKeeper最新版本(V3.4.12)

    0.ZooKeeper文档 http://zookeeper.apache.org/doc/r3.4.11/zookeeperOver.html 1.准备 在CentOS7上安装zookeeper时, ...

  2. FP又称为Monadic Programming

    什么是Monad? trait Monad[+T] { def flatMap[U]( f : (T) => Monad[U] ) : Monad[U] def unit(value : B)  ...

  3. BZOJ4870:[SHOI2017]组合数问题(组合数学,矩阵乘法)

    Description Input 第一行有四个整数 n, p, k, r,所有整数含义见问题描述. 1 ≤ n ≤ 10^9, 0 ≤ r < k ≤ 50, 2 ≤ p ≤ 2^30 − 1 ...

  4. pathinfo

    location ~ \.php { fastcgi_split_path_info ^((?U).+\.php)(/?.+)$; fastcgi_param PATH_INFO $fastcgi_p ...

  5. Eclipse配置多个Tomcat服务器

    我们在开发大型web项目时,经常需要在eclipse中同时启动多个tomcat服务器来开启多个服务.这里讲解一下如何在eclipse中配置多个tomcat服务器. 配置步骤 1. 在tomcat官网( ...

  6. PAT——1024. 科学计数法

    科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+-][0-9]+,即数字的整数部分只有1位,小数部分至少有1位 ...

  7. cloudstack 用admin 账号创建虚拟机只是提示insufficient resource

    报错: com.cloud.exception.ResourceUnavailableException: Resource [DataCenter:1] is unreachable: Unable ...

  8. 01.centos7环境准备

    博客为日常工作学习积累总结: 1.环境准备: 系统版本:CentOS-7-x86_64-Minimal-1810.iso 运行环境:虚拟机windows上的VM 15 系统安装:参照老男孩运维要求 2 ...

  9. Linux(CentOS7)设置自动备份数据库到阿里云OSS

    环境:阿里云服务器CentOS7.4 + MySQL5.6 基本思路: 1.编写shell脚本,备份数据库到指定目录下 2.编写Python脚本,把文件上传到OSS 3.把shell脚本和Python ...

  10. MySQL----MySQL数据库入门----第一章 数据库入门

    第一章 数据库入门 1.1 数据库基础知识 1.1.1 数据库概述 数据不仅包括普通意义上的数字,还包括文字.图像.声音等.也就是说,凡是在计算机中用来描述事物的记录都可称作数据. 数据库的基本特点: ...