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

题面

darkbzoj

题解

\(g[i]\)表示长度为\(i\)的非降序列的个数

那么,
\[
ans = \sum_{i=1}^{n}g[i]*(n-i)!-g[i+1]*(n-i-1)!*(i+1)
\]

怎么求\(g[i]\)呢

设\(f[i][j]\)为长度为\(i\)的非降序列,以最后一个数是\(j\)的数量

\(f[i][j] = \sum f[i-1][k](k<=j)\)

这样是\(O(n^3)\)

因为带修改,所以树状数组优化转移

复杂度:\(O(n^2logn)\)

Code

#include<bits/stdc++.h>

#define LL long long
#define RG register

using namespace std;
template<class T> inline void read(T &x) {
    x = 0; RG char c = getchar(); bool f = 0;
    while (c != '-' && (c < '0' || c > '9')) c = getchar(); if (c == '-') c = getchar(), f = 1;
    while (c >= '0' && c <= '9') x = x*10+c-48, c = getchar();
    x = f ? -x : x;
    return ;
}
template<class T> inline void write(T x) {
    if (!x) {putchar(48);return ;}
    if (x < 0) x = -x, putchar('-');
    int len = -1, z[20]; while (x > 0) z[++len] = x%10, x /= 10;
    for (RG int i = len; i >= 0; i--) putchar(z[i]+48);return ;
}
const int N = 2010, Mod = 1e9 + 7;
int n, a[N], b[N], f[N][N], m;
void pls(int &x, int y) {
    x += y;
    if (x >= Mod) x -= Mod;
    if (x < 0) x += Mod;
}
#define lowbit(x) (x & (-x))
void add(int id, int x, int k) { for (; x <= m; x += lowbit(x)) pls(f[id][x], k); }
int sum(int id, int x) { int res = 0; for (; x; x -= lowbit(x)) pls(res, f[id][x]); return res; }
int g[N], fac[N];

int main() {
    read(n);
    for (int i = 1; i <= n; i++) read(a[i]), b[i] = a[i];
    sort(b + 1, b + 1 + n);
    m = unique(b + 1, b + 1 + n) - b - 1;
    for (int i = 1; i <= n; i++) a[i] = lower_bound(b + 1, b + 1 + m, a[i]) - b;
    add(0, 1, 1);
    for (int i = 1; i <= n; i++)
        for (int j = i; j >= 1; j--) {
            int tmp = sum(j - 1, a[i]);
            pls(g[j], tmp);
            add(j, a[i], tmp);
        }
    int ans = 0;
    fac[0] = 1;
    for (int i = 1; i <= n; i++) fac[i] = 1ll * fac[i - 1] * i % Mod;
    for (int i = 1; i <= n; i++) pls(ans, (1ll * fac[n - i] * g[i] % Mod - 1ll * fac[n - i - 1] * g[i + 1] % Mod * (i + 1) % Mod + Mod) % Mod);
    printf("%d\n", ans);
    return 0;
}

原文地址:https://www.cnblogs.com/zzy2005/p/10612541.html

时间: 2024-11-08 13:56:42

bzoj4361:isn(dp+容斥+树状数组)的相关文章

hdu-5792 World is Exploding(容斥+树状数组)

题目链接: World is Exploding Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Others) Problem Description Given a sequence A with length n,count how many quadruple (a,b,c,d) satisfies: a≠b≠c≠d,1≤a<b≤n,1≤c<d≤n,Aa<Ab,Ac>A

hdu6078 Wavel Sequence dp+二维树状数组

//#pragma comment(linker, "/STACK:102400000,102400000") /** 题目:hdu6078 Wavel Sequence 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6078 题意:给定a序列和b序列.从a中取一个子序列x(数的位置顺序保持不变),子序列每个数满足a1<a2>a3<a4>a5<a6... 波浪形 从b中取相同长度的子序列y,也满足波浪形. 如果x

HDU 5293 Tree chain problem 树形dp+dfs序+树状数组+LCA

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 题意: 给你一些链,每条链都有自己的价值,求不相交不重合的链能够组成的最大价值. 题解: 树形dp, 对于每条链u,v,w,我们只在lca(u,v)的顶点上处理它 让dp[i]表示以i为根的指数的最大值,sum[i]表示dp[vi]的和(vi为i的儿子们) 则i点有两种决策,一种是不选以i为lca的链,则dp[i]=sum[i]. 另一种是选一条以i为lca的链,那么有转移方程:dp[i]=

HDU 2227 Find the nondecreasing subsequences (DP+树状数组+离散化)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2227 Find the nondecreasing subsequences                                  Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)                                             

【算法学习笔记】40.树状数组 动态规划 SJTU OJ 1289 扑克牌分组

Description cxt的扑克牌越来越先进了,这回牌面的点数还可以是负数, 这回cxt准备给扑克牌分组,他打算将所有的牌分成若干个堆,每堆的牌面总和和都要大于零.由于扑克牌是按顺序排列的,所以一堆牌在原牌堆里面必须是连续的.请帮助cxt计算一下,存在多少种不同的分牌的方案.由于答案可能很大,只要输出答案除以1,000,000,009的余数即可. Input Format 第一行:单个整数:N,1 ≤ N ≤ 10^6 第二行到N + 1行:在第i + 1行有一个整数:Ai, 表示第i张牌牌

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

[BZOJ4361]isn Description 给出一个长度为n的序列A(A1,A2...AN).如果序列A不是非降的,你必须从中删去一个数, 这一操作,直到A非降为止.求有多少种不同的操作方案,答案模10^9+7. Input 第一行一个整数n. 接下来一行n个整数,描述A. Output 一行一个整数,描述答案. Sample Input 4 1 7 5 3 Sample Output 18 HINT 1<=N<=2000 题解:想到动归+树状数组+容斥,但是容斥系数想复杂了~ 我们希

4.4 省选模拟赛 拉格朗日计数 树状数组+容斥.

像这种计数 问题什么的 是最讨厌的了... 考虑是环往环后面再续一段 暴力枚举前两个数字 树状数组统计第三个数的个数 n^2log. 考虑只枚举第个数 发现由于边界问题什么的很难处理. 再将枚举直接放到环上 发现边界问题没有了 不过存在 枚举第二个数之后 有 123 231 312 这三种形式. 第一种形式很好统计 预处理一下左边有多少个数字比自己小即可. 考虑第二种和第三种形式 很难在枚举2的时候统计出来这两种形式 考虑容斥 231=XX1-321. 312=3XX-321. 发现XX1和3X

UVA12983 The Battle of Chibi 树状数组+DP

先容蒟蒻吐槽一波:模数看错调了一两小时... 题意: 要你在一个长度为n的序列中找到长度为m的严格上升子序列的个数,然后答案对1e9+7取模. 举个例子: 5 3 1 3 4 2 5 那么符合条件的序列就有: 1 3 4 ,1 2 5, 1 3 5 ,1 4 5, 3 4 5, 答案就是5. 既然和上升子序列有关,那么就是DP了. 注意我这里设的i,j有点不一样,表示的是 前j个数,以a[j]结尾的,严格上升子序列长度为i的方案数.(反过来也OK,只不过待会BIT就得开两维) 容易得到状态转移方

HDU 5542 The Battle of Chibi dp+树状数组

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5542 题意:给你n个数,求其中上升子序列长度为m的个数 可以考虑用dp[i][j]表示以a[i]结尾的长度为j的上升子序列有多少 裸的dp是o(n2m) 所以需要优化 我们可以发现dp的第3维是找比它小的数,那么就可以用树状数组来找 这样就可以降低复杂度 #include<iostream> #include<cstdio> #include<cstring> #include