Luogu4528 CTSC2008 图腾 树状数组、容斥
设$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 图腾 树状数组、容斥的更多相关文章
- 【BZOJ4361】isn 动态规划+树状数组+容斥
[BZOJ4361]isn Description 给出一个长度为n的序列A(A1,A2...AN).如果序列A不是非降的,你必须从中删去一个数, 这一操作,直到A非降为止.求有多少种不同的操作方案, ...
- 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) ...
- BZOJ.4361.isn(DP 树状数组 容斥)
题目链接 长度为\(i\)的不降子序列个数是可以DP求的. 用\(f[i][j]\)表示长度为\(i\),结尾元素为\(a_j\)的不降子序列个数.转移为\(f[i][j]=\sum f[i-1][k ...
- 【BZOJ 4361】 4361: isn (DP+树状数组+容斥)
4361: isn Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 218 Solved: 126 Description 给出一个长度为n的序列A( ...
- AcWing 241.楼兰图腾 (树状数组,逆序对)
题意:在二维坐标轴上给你一些点,求出所有由三个点构成的v和∧图案的个数. 题解:因为给出的点是按横坐标的顺序给出的,所以我们可以先遍历然后求出某个点左边比它高和低的点的个数(这个过程简直和用树状数组求 ...
- hdu 5792(树状数组,容斥) World is Exploding
hdu 5792 要找的无非就是一个上升的仅有两个的序列和一个下降的仅有两个的序列,按照容斥的思想,肯定就是所有的上升的乘以所有的下降的,然后再减去重复的情况. 先用树状数组求出lx[i](在第 i ...
- BZOJ4361 isn 树状数组、DP、容斥
传送门 不考虑成为非降序列后停止的限制,那么答案显然是\(\sum\limits_{i=1}^N cnt_i \times (N-i)!\),其中\(cnt_i\)表示长度为\(i\)的非降序列数量 ...
- [CF1086E]Beautiful Matrix(容斥+DP+树状数组)
给一个n*n的矩阵,保证:(1)每行都是一个排列 (2)每行每个位置和上一行对应位置不同.求这个矩阵在所有合法矩阵中字典序排第几.考虑类似数位DP的做法,枚举第几行开始不卡限制,那么显然之前的行都和题 ...
- BZOJ 4361 isn 容斥+dp+树状数组
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4361 题意概述: 给出一个长度为N的序列A(A1,A2...AN).如果序列A不是非降的 ...
随机推荐
- Html/Css 初步认识笔记
1.什么是 HTML ? HTML(HyperText Markup Language) 的学名是超文本标记语言. 标记用来表示网页内容要如何显示,自身不显示 .<我就是标记> 标记成对出 ...
- 基础篇|一文搞懂RNN(循环神经网络)
基础篇|一文搞懂RNN(循环神经网络) https://mp.weixin.qq.com/s/va1gmavl2ZESgnM7biORQg 神经网络基础 神经网络可以当做是能够拟合任意函数的黑盒子,只 ...
- SoapUI 访问代理设置
SoapUI 访问代理设置 by:授客 QQ:1033553122 问题描述: 运行SoapUI时,发现接口访问不通,如下图,提示"Connection to http://127.0.0. ...
- Flutter 布局(十)- ListBody、ListView、CustomMultiChildLayout详解
本文主要介绍Flutter布局中的ListBody.ListView.CustomMultiChildLayout控件,详细介绍了其布局行为以及使用场景,并对源码进行了分析. 1. ListBody ...
- [Android] 获取系统顶部状态栏(Status Bar)与底部导航栏(Navigation Bar)的高度
Android一些设备都有上下两条bar,我们可以获取这些bar的信息.下面放上获取高度的代码.代码注释和其他方法有空再放. 原文地址请保留http://www.cnblogs.com/rossone ...
- linux运行apache出现403错误
1.文档权限问题,这是linux操作系统下经常会遇到的问题,需要使用chmod的指令把网站所在目录的权限提升到755.2.SElinux,开启它也会导致403错误的产生. 查看SELinux状态:1. ...
- Beta冲刺(2/5)(麻瓜制造者)
今日完成任务 邓弘立:继续完成了昨天未完成的登录接口的重编码与测试. 李佳铭|:进一步完善了收藏UI 江郑: 对使用前端框架页面元素的进一步优化,基本功能进行中 刘双玉:部分图书馆租借接口修改 肖小强 ...
- web页面中快速找到html对应元素两种方法
一.第一种方法(通过先进入开发模式然后再去选择网页元素) 1.打开IE.Chrome.FireFox等,按 F12 键进入开发模式 2.在打开的控制窗口左上角有个 箭头 按钮,点击它之后,此时将鼠标 ...
- jquery计算时间差(天、时、分、秒)并使用定时器实时获取
类似网站抢购需求,会有个时间倒计时的展示(天.时.分.秒) 要拿到最终时间与当前时间对比,算出时间差并用定时器以秒的方式执行 实现代码: $(document).ready(function(){ r ...
- Django的settings配置
静态文件 STATIC_URL = '/static/' # 别名 STATICFILES_DIRS = [ os.path.join(BASE_DIR,'static'), os.path.join ...