P3157 [CQOI2011]动态逆序对(树状数组套线段树)
树状数组套线段树
静态逆序对咋做?树状数组(别管归并QWQ)
然鹅动态的咋做?
我们考虑每次删除一个元素。
减去的就是与这个元素有关的逆序对数,介个可以预处理:从左到右求一次,再倒过来求一次,用2个数组存起来。
但是前面已经删除的元素与当前删除元素组成的逆序对会被重复计数。
于是考虑再减去重复计数
我们用树状数组套线段树(动态开点):
第$i$棵线段树 储存 每个位置在$i$之前的被删除元素
蓝后每次查询时左边右边找一找
把它们加回来就好辣
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
void read(int &x){
static char c=getchar();x=;
while(c<''||c>'') c=getchar();
while(''<=c&&c<='') x=x*+(c^),c=getchar();
}
#define W 6000005
#define N 100005
int n,m,u,pos[N],id[N],s[N];
int rt[N],sum[W],lc[W],rc[W];
ll ans,L[N],R[N];
void T_Add(int x,int v){for(;x<=n;x+=x&-x)s[x]+=v;}
int T_Sum(int x){int re=; for(;x;x-=x&-x)re+=s[x]; return re;}
#define mid (l+r)/2
void S_Add(int &o,int l,int r,int x){
if(!o) o=++u;
++sum[o];
if(l==r) return;
if(x<=mid) S_Add(lc[o],l,mid,x);
else S_Add(rc[o],mid+,r,x);
}
int S_Sum(int o,int l,int r,int x1,int x2){
if(x1<=l&&r<=x2) return sum[o];
int re=;
if(x1<=mid) re+=S_Sum(lc[o],l,mid,x1,x2);
if(x2>mid) re+=S_Sum(rc[o],mid+,r,x1,x2);
return re;
}
ll S_Find(int l,int r,int x1,int x2){//查询l+1~r内所有范围在x1~x2的个数
if(x1>x2) return ;
ll re=;
for(int i=r;i;i-=i&-i) re+=(ll)S_Sum(rt[i],,n,x1,x2);
for(int i=l;i;i-=i&-i) re-=(ll)S_Sum(rt[i],,n,x1,x2);
return re;
}
int main(){
read(n);read(m); register int i,j; int q,p;
for(i=;i<=n;++i){
read(pos[i]); id[pos[i]]=i;
L[i]=T_Sum(n)-T_Sum(pos[i]);
ans+=L[i]; T_Add(pos[i],);
}memset(s,,sizeof(s));
for(i=n;i;--i) R[i]=T_Sum(pos[i]-),T_Add(pos[i],);
for(i=;i<=m;++i){
printf("%lld\n",ans); read(q); p=id[q];
ans-=L[p]+R[p]-S_Find(,p,q+,n)-S_Find(p,n,,q-);
for(j=p;j<=n;j+=j&-j) S_Add(rt[j],,n,q);
}return ;
}
P3157 [CQOI2011]动态逆序对(树状数组套线段树)的更多相关文章
- BZOJ.4553.[HEOI2016&TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)
题目链接:BZOJ 洛谷 \(O(n^2)\)DP很好写,对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]=d[j]+1\) for(int j=1; j<i; ++j) if(a[ ...
- BZOJ 1901 Zju2112 Dynamic Rankings 树状数组套线段树
题意概述:带修改求区间第k大. 分析: 我们知道不带修改的时候直接上主席树就可以了对吧?两个版本号里面的节点一起走在线段树上二分,复杂度是O((N+M)logN). 然而这里可以修改,主席树显然是凉了 ...
- [APIO2019] [LOJ 3146] 路灯 (cdq分治或树状数组套线段树)
[APIO2019] [LOJ 3146] 路灯 (cdq分治或树状数组套线段树) 题面 略 分析 首先把一组询问(x,y)看成二维平面上的一个点,我们想办法用数据结构维护这个二维平面(注意根据题意这 ...
- bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1384 Solved: 629[Submit][Stat ...
- [BZOJ 3196] 213平衡树 【线段树套set + 树状数组套线段树】
题目链接:BZOJ - 3196 题目分析 区间Kth和区间Rank用树状数组套线段树实现,区间前驱后继用线段树套set实现. 为了节省空间,需要离线,先离散化,这样需要的数组大小可以小一些,可以卡过 ...
- [BZOJ 1901] Dynamic Rankings 【树状数组套线段树 || 线段树套线段树】
题目链接:BZOJ - 1901 题目分析 树状数组套线段树或线段树套线段树都可以解决这道题. 第一层是区间,第二层是权值. 空间复杂度和时间复杂度均为 O(n log^2 n). 线段树比树状数组麻 ...
- bzoj3196 二逼平衡树 树状数组套线段树
题目传送门 思路:树状数组套线段树模板题. 什么是树状数组套线段树,普通的树状数组每个点都是一个权值,而这里的树状数组每个点都是一颗权值线段树,我们用前缀差分的方法求得每个区间的各种信息, 其实关键就 ...
- 【序列操作IV】树状数组套线段树/树套树
题目描述 给出序列 a1,a2,…,an(0≤ai≤109),有关序列的两种操作. 1. ai(1≤i≤n)变成 x(0≤x≤109). 2. 求 al,al+1,…,ar(1≤l≤r≤n)第 k(1 ...
- 2019南昌网络赛 I. Yukino With Subinterval 树状数组套线段树
I. Yukino With Subinterval 题目链接: Problem Descripe Yukino has an array \(a_1, a_2 \cdots a_n\). As a ...
随机推荐
- [LeetCode] 129. Sum Root to Leaf Numbers_Medium tag: DFS
Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number ...
- iText C# 合并PDF文件流,以及A5变A4时内容默认放在最底下的问题的解决方法;ASP.NET 实现Base64文件流下载PDF
/// <summary> 合併PDF檔(集合) </summary> /// <param name="files">欲合併PDF檔之集合(一 ...
- vue框架(三)_vue引入jquery、bootstrap
一.vue安装jquery 1.按照之前博客的内容,新建一个vue工程. 2.在项目文件夹下,使用命令npm install jquery --save-dev 引入jquery. 3.在build/ ...
- Android -- 打造我们的StepView
1,前两天我们分析了Github开源的StepView <自定义StepView实现个人信息验证进度条>,这两天想着想自己写一个,so,就有了这一篇文章,不废话,先看看实现的效果: 2,首 ...
- SQL中的关联更新和关联删除
在SQL中,经常用到关联查询,比如select a.* from A a inner join B b on a.PId=b.FId where 条件,SQL中也支持类似的关联更新和关联删除. 关联更 ...
- windows系统快捷键
1.我的键盘:windows键的开启,需要按住FN键+windows键. 2.windows键 + E,表示打开我的电脑. 3.windows键 + R,打开windows的命令行窗口. 4.wind ...
- 【转】查看sqlserver被锁的表以及如何解锁
查看被锁表: select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys. ...
- uva 1632 Alibaba
题意: 一个人要从如果干个地方拿货,每个地方的货物是有存在时间的,到了某个时间之后就会消失. 按照位置从左到右给出货物的位置以及生存时间,这个人选择一个最优的位置出发,问拿完货物的最少时间. 思路: ...
- First Wainberg-2018-Deep learning in biomedicine Experience
ppt+paper 链接:https://pan.baidu.com/s/14toqjcSJti5ZXT3ff4rwIA 提取码:xgkt
- K-Means算法的Java实现
K-means算法是硬聚类算法,是典型的基于原型的目标函数聚类方法的代表,它是数据点到原型的某种距离作为优化的目标函数,利用函数求极值的方法得到迭代运算的调整规则.K-means算法以欧式距离作为相似 ...