Description

Solution

定义dp[i][j]为在1到i个数中选了j个数,并且保证选了i的选法总数。

dp[i][j]为所有满足A[k]>A[i]的k(k<i)的dp[k][j-1]之和。在处理完dp[i][j]后,在树状数组里A[i]位置填上dp[i][j-1]的值就好。这样可以优化一下复杂度。[A可能要离散化一下]

然后,容斥大法好~

定义g[x]为最终序列长度为x的方案数。由于x是从大变小,所有的g[i]都是已经处理完毕的了。

(似乎还有一种不用n2操作,直接扫一遍就好的方法,不知道是不是二项式反演)

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int mod=1e9+;
typedef long long ll;
int n,a[],t[],rk[];
bool cmp(int x,int y){return a[x]<a[y];}
ll dp[][],g[]; ll fac[],inv[];
void pre()
{
fac[]=fac[]=inv[]=inv[]=;
for (int i=;i<=n;i++)
{
fac[i]=fac[i-]*i%mod;
inv[i]=(mod-mod/i)*inv[mod%i]%mod;
}
for (int i=;i<=n;i++) inv[i]=inv[i]*inv[i-]%mod;
}
ll C(int x,int y){return fac[y]*inv[x]%mod*inv[y-x]%mod;} ll tree[];
void add(int id,ll x){for(;id<=n;id+=id&-id) tree[id]+=x,tree[id]%=mod;}
ll query(int id){ll re=;for(;id;id-=id&-id) re+=tree[id],re%=mod;return re;}
int main()
{
scanf("%d",&n);
pre();
for (int i=;i<=n;i++)
{
scanf("%d",&a[i]);t[i]=i;
}
sort(t+,t+n+,cmp);
int js=;
a[]=-;
for (int i=;i<=n;i++)
{
if (a[t[i]]!=a[t[i-]]) js++;
rk[t[i]]=js;
}
for (int i=;i<=n;i++) dp[i][]=;
for (int j=;j<=n;j++)
{
memset(tree,,sizeof(tree));
add(rk[j-],dp[j-][j-]);
for (int i=j;i<=n;i++)
{
dp[i][j]=query(rk[i]);
add(rk[i],dp[i][j-]);
}
} g[n]=dp[n][n];
for (int i=n-;i;i--)
{
for (int j=;j<=n;j++) g[i]+=dp[j][i]*fac[n-i]%mod,g[i]%=mod;
for (int j=i+;j<=n;j++)
g[i]-=C(i,j)*g[j]%mod*fac[j-i]%mod,g[i]%=mod;
}
ll ans=;
for (int i=;i<=n;i++) ans=(ans+g[i]+mod)%mod;
cout<<ans;
}

[2016北京集训测试赛7]isn-[树状数组+dp+容斥]的更多相关文章

  1. [2016北京集训测试赛15]statement-[线段树+拆环]

    Description Solution 由于题目要求,将a[i]->b[i](边权为i)后所得的图应该是由森林和环套树组合而成. 假如是树形结构,所有的t[i]就直接在线段树t[i]点的dfs ...

  2. hdu 5792(树状数组,容斥) World is Exploding

    hdu 5792 要找的无非就是一个上升的仅有两个的序列和一个下降的仅有两个的序列,按照容斥的思想,肯定就是所有的上升的乘以所有的下降的,然后再减去重复的情况. 先用树状数组求出lx[i](在第 i ...

  3. Luogu4528 CTSC2008 图腾 树状数组、容斥

    传送门 设$f_i$表示$i$排列的数量,其中$x$表示不确定 那么$$ans=f_{1324}-f_{1432}-f_{1243}=(f_{1x2x}-f_{1423})-(f_{14xx}-f_{ ...

  4. [2016北京集训测试赛5]小Q与内存-[线段树的神秘操作]

    Description Solution 哇真的异常服气..线段树都可以搞合并和拆分的啊orzorz.神的世界我不懂 Code #include<iostream> #include< ...

  5. 2016北京集训测试赛(十一)Problem C: 树链问题

    Solution 智障暴力题, 每个点维护一下子树信息, 树剖就好了. 我居然还傻了写了一发毛毛虫... #include <cstdio> #include <cctype> ...

  6. 2016北京集训测试赛(十七)Problem C: 数组

    Solution 线段树好题. 我们考虑用last[i]表示\(i\)这个位置的颜色的上一个出现位置. 考虑以一个位置\(R\)为右端点的区间最远能向左延伸到什么位置: \(L = \max_{i \ ...

  7. 2016北京集训测试赛(十七)Problem B: 银河战舰

    Solution 好题, 又是长链剖分2333 考虑怎么统计答案, 我场上的思路是统计以一个点作为结尾的最长上升链, 但这显然是很难处理的. 正解的方法是统计以每个点作为折弯点的最长上升链. 具体的内 ...

  8. 2016北京集训测试赛(十六)Problem A: 任务安排

    Solution 这道题告诉我们, 不能看着数据范围来推测正解的时间复杂度. 事实证明, 只要常数足够小, \(5 \times 10^6\)也是可以跑\(O(n \log n)\)算法的!!! 这道 ...

  9. BZOJ 4543 2016北京集训测试赛(二)Problem B: thr 既 长链剖分学习笔记

    Solution 这题的解法很妙啊... 考虑这三个点可能的形态: 令它们的重心为距离到这三个点都相同的节点, 则其中两个点分别在重心的两棵子树中, 且到重心的距离相等; 第三个点可能在重心的一棵不同 ...

随机推荐

  1. Cinder组件解析

    1  Cinder架构图 Cinder是在虚拟机和具体存储设备之间引入了一层“逻辑存储卷”的抽象,Cinder本身并不是一种存储技术,只是提供一个中间的抽象层,Cinder通过调用不同存储后端类型的驱 ...

  2. vue-cli + webpack自动生成项目

    # 全局安装 vue-cli $ npm install --global vue-cli # 创建一个基于 webpack 模板的新项目 $ vue init webpack palanWebsit ...

  3. css3动画相关笔记

    1.$(".aa").delay(2500).animate({width:0}); // 延迟 2.setTimeout(function(){ --> css3 anim ...

  4. java中JVM的原理重温【转】

    一.基础理论知识 1.java虚拟机的生命周期: Java虚拟机的生命周期 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序.程序开始执行时他才运行,程序结束时他就停止.你在同一台机器上 ...

  5. Odoo字段类型

    转载请注明原文地址:https://www.cnblogs.com/cnodoo/p/9278620.html    一:基本字段类型 Binary:二进制类型,用于保存图片.视频.文件.附件等,在视 ...

  6. 在Windows 10中更改网络连接优先级

    查看接口列表 (也可使用 如下) 选择网络连接,然后单击右侧的箭头以更改网络连接优先级.  可以参考之前的部分 链接在此 更改单个wi-fi连接顺序可以使用如下

  7. ExtJs中decode与encode(转载)

    出自:http://blog.163.com/xiao_mege/blog/static/72942753201102693545195/ 在述说这个例子之前,我假想你已经知道什么是Json数据了,那 ...

  8. ORACLE NLS_LENGTH_SEMANTICS 参数的用途

    NLS_LENGTH_SEMANTICS参数是一个专为创建CHAR和VARCHAR2两种字符型的列时,指定使用的字节长度,还是使用字符长度的定义方式,有byte和char两种值,默认为byte. 当设 ...

  9. ansible copy 模块 changed false 没有变化

    在分发配置文件的时候,我用命令ansible big_hosthub  -m copy -a "src=/home/clouder/deploy-conf.xml dest=/home/cl ...

  10. LD-sketch源码阅读

    目录 util.h hash.hpp/cpp mangle函数 GenHashSeed函数 AwareHash模块 LDSketch.hpp/cpp LDSketch更新函数,对一个sketch插入键 ...