传送门


设$f_i$表示$i$排列的数量,其中$x$表示不确定

那么$$ans=f_{1324}-f_{1432}-f_{1243}=(f_{1x2x}-f_{1423})-(f_{14xx}-f_{1423})-(f_{12xx}-f_{1234})$$

$$=f_{1x2x}-(f_{14xx}+f_{12xx})+f_{1234}$$

$$=f_{1x2x}-f_{1xxx}+f_{13xx}+f_{1234}$$

①$f_{1xxx}$用树状数组求正序对

②$f_{1234}$四个树状数组瞎搞

③$f_{1x2x}$,考虑枚举$2$的位置

设$l_i$表示满足$j<i,a_j<a_i$的$j$的数量,$r_i$表示满足$j>i,a_j<a_i$的$j$的数量

那么右边的$x$的取法就是$N-i-r_i$种

考虑左边的$x$,考虑容斥。满足$p<i,q<i,a_p<a_i$的有序数对$(p,q)$的数量有$l_i \times (i-1)$个,但是其中多算了:

a.$p<q , a_q<a_i$,个数有$C_{l_i}^2$个

b.$p \geq q$,个数有$\sum j[j < i,a_j<a_i]$种

④$f_{13xx}$,考虑枚举$3$的位置,那么右边的$4$的取法有$N-i-r_i$种

仍然考虑容斥。满足$a_p<a_i , a_q < a_i , p < i$的个数为$(a_i-1) \times l_i$

考虑多算了什么:

a.$a_q > a_p , q < i$,有$C_{l_i}^2$种

b.$a_q \leq a_p$,有$\sum a_j[j < i , a_j < a_i]$种

上面四种加起来就行了

#include<bits/stdc++.h>
//This code is written by Itst
using namespace std;

inline int read(){
    ;
    ;
    char c = getchar();
    while(c != EOF && !isdigit(c)){
        if(c == '-')
            f = ;
        c = getchar();
    }
    while(c != EOF && isdigit(c)){
        a = (a << ) + (a << ) + (c ^ ');
        c = getchar();
    }
    return f ? -a : a;
}

 , MOD = ;
int num[MAXN] , N , sum;

namespace calc{
    ][MAXN] , l[MAXN] , r[MAXN];

    inline int lowbit(int x){
        return x & -x;
    }

    inline void add(int ver , int dir , int num){
        while(dir <= N){
            (Tree[ver][dir] += num) %= MOD;
            dir += lowbit(dir);
        }
    }

    inline int get(int ver , int dir){
        ;
        while(dir){
            (sum += Tree[ver][dir]) %= MOD;
            dir -= lowbit(dir);
        }
        return sum;
    }

    void calc_1xxx(){
        for(int i = N ; i ; --i){
             , num[i]);
            sum = (sum - t * (t - ) * (t - ) /  % MOD + MOD) % MOD;
            add( , num[i] , );
        }
    }

    void calc_1234(){
         ; i <= N ; ++i){
            sum = (sum +  , num[i])) % MOD;
            add( , num[i] ,  , num[i]));
            add( , num[i] ,  , num[i]));
            add( , num[i] , );
        }
        memset(Tree ,  , sizeof(Tree));
    }

    void calcl(){
         ; i <= N ; ++i){
            l[i] =  , num[i]);
            add( , num[i] , );
        }
    }

    void calcr(){
        for(int i = N ; i ; --i){
            r[i] =  , num[i]);
            add( , num[i] , );
        }
    }

    void calc_1x2x(){
         ; i <= N ; ++i){
            ) - 1ll * l[i] * (l[i] - ) /  -  , num[i])) % MOD;
            sum = (sum + times * base) % MOD;
            add( , num[i] , i);
        }
    }

    void calc_13xx(){
         ; i <= N ; ++i){
            ) - 1ll * l[i] * (l[i] - ) /  -  , num[i])) % MOD;
            sum = (sum + times * base) % MOD;
            add( , num[i] , num[i]);
        }
    }

}

int main(){
#ifndef ONLINE_JUDGE
    freopen("4528.in" , "r" , stdin);
    //freopen("4528.out" , "w" , stdout);
#endif
    N = read();
     ; i <= N ; ++i)
        num[i] = read();
    calc::calc_1xxx();
    calc::calc_1234();
    calc::calcl();
    calc::calcr();
    calc::calc_1x2x();
    calc::calc_13xx();
    cout << sum;
    ;
}

Luogu4528 CTSC2008 图腾 树状数组、容斥的更多相关文章

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

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

  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.isn(DP 树状数组 容斥)

    题目链接 长度为\(i\)的不降子序列个数是可以DP求的. 用\(f[i][j]\)表示长度为\(i\),结尾元素为\(a_j\)的不降子序列个数.转移为\(f[i][j]=\sum f[i-1][k ...

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

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

  5. AcWing 241.楼兰图腾 (树状数组,逆序对)

    题意:在二维坐标轴上给你一些点,求出所有由三个点构成的v和∧图案的个数. 题解:因为给出的点是按横坐标的顺序给出的,所以我们可以先遍历然后求出某个点左边比它高和低的点的个数(这个过程简直和用树状数组求 ...

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

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

  7. BZOJ4361 isn 树状数组、DP、容斥

    传送门 不考虑成为非降序列后停止的限制,那么答案显然是\(\sum\limits_{i=1}^N cnt_i \times (N-i)!\),其中\(cnt_i\)表示长度为\(i\)的非降序列数量 ...

  8. [CF1086E]Beautiful Matrix(容斥+DP+树状数组)

    给一个n*n的矩阵,保证:(1)每行都是一个排列 (2)每行每个位置和上一行对应位置不同.求这个矩阵在所有合法矩阵中字典序排第几.考虑类似数位DP的做法,枚举第几行开始不卡限制,那么显然之前的行都和题 ...

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

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

随机推荐

  1. SuperMap iServer 扩展/JAVA API 系列博客整理

    转载:http://blog.csdn.net/supermapsupport/article/details/70158940 SuperMap iServer为广大用户提供了整套 SDK,应用开发 ...

  2. BI怎么选?重点看这10个技术指标

    2016年,商业智能市场火热,不管是投资圈还是IT圈,都在广泛关注着大数据和商业智能.宣传广告媒体报道见多了,不知道大家对BI选型的技术标准有谱了没.笔者对Gartner的BI魔力象限考评的15个关键 ...

  3. mysql 优化配置参数(my.cnf)

    max_connections:允许客户端并发连接的最大数量,默认值是151,一般将该参数设置为500-2000max_connect_errors:如果客户端尝试连接的错误数量超过这个参数设置的值, ...

  4. Expo大作战(三十六)--expo sdk api之 ImagePicker,ImageManipulator,Camera

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  5. 【PHP调试篇】PHP高性能日志组件SeasLog

    简述 什么是SeasLog SeasLog是一个C语言编写的PHP扩展,提供一组规范标准的功能函数,在PHP项目中方便.规范.高效地写日志,以及快速地读取和查询日志. 为什么使用SeasLog 无论在 ...

  6. centos7执行umount提示:device is busy或者target is busy解决方法

    问题描述: 因为挂载错了,想取消挂载,但是umount报告如下错误: [root@zabbix /]# umount /dev/sdc1 umount: /data1: target is busy. ...

  7. CentOS7安装搭建.Net Core 2.0环境-详细步骤

    一.构建.Net core 2的应用程web发布 因为是用来测试centos上的core 环境,先直接用vs17自带的core实例. 二.部署CentOS7的core环境 1.连接并启动之前安装的虚拟 ...

  8. 12LaTeX学习系列之---LaTex的图片插入

    目录 目录 前言 (一)插图的基本语法 (二)插入的基本设置 1.说明: 2.源代码: 3.输出效果 (三)查看文档 目录 本系列是有关LaTeX的学习系列,共计19篇,本章节是第12篇. 前一篇:1 ...

  9. 第 15 章 位操作(fields)

    /*----------------------------------- fields.c -- 定义并使用字段 -----------------------------------*/ #inc ...

  10. Alpha冲刺! Day5 - 砍柴

    Alpha冲刺! Day5 - 砍柴 今日已完成 晨瑶:review了业务逻辑表格,确定了工具类具体函数有哪些:讨论确定了记录的存储方式为HTML. 昭锡:继续学习Gson,并写出json基本操作的D ...