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 ...
随机推荐
- docker 在宿主机上根据进程PID查找归属容器ID
在使用docker时经常出现一台docker主机上跑了多个容器,可能其中一个容器里的进程导致了整个宿主机load很高,其实一条命令就可以找出罪魁祸首 #查找容器ID docker inspect -f ...
- windows下使用sed和tee命令
最近需要在winowds slave上设置构建app和sdk,至于如何在windows slave上构建c/c++代码生成sdk(dll,lib之类)和apk(exe文件),请参考我的另外一篇博客,即 ...
- MacBook PyCharm永久激活
今天下午突然提示到期不能用了,一阵慌慌... 1.下载补丁 注意下载后不需要移动补丁位置,下载文件名为:JetbrainsCrack-release-enc.jar 的文件 链接:https://pa ...
- js图的数据结构处理---迪杰斯特拉算法
/*//1.确定数据结构, mapf[i][j] 为点i到点j的距离 [ Infinity 2 5 Infinity Infinity Infinity Infinity 2 6 Infinity I ...
- CentOS6.5安装Kibana5.3.0
1.写在安装之前,安装Kibana之前需要先安装Elasticsearch,为了安装时不出错,建议选择这两者选择一样的版本,本文全部选择5.3版本. 2.首先到官网下载安装包: https://art ...
- python shutil.copytree 解决目标目录存在的情况
直接修改copytree的实现即可,如下: #copytree中找到 os.makedirs(dst),加入判断,就这么简单 if not os.path.exists(dst): os.makedi ...
- unity3d-多媒体与网络
1.音乐 unity3d 共支持4种音乐的格式文件 aiff:适用于较短的音乐文件,可用于游戏音效 wav:适用于较短的音乐文件,可用于游戏音效 mp3:适用于较长的音乐文件,可用于游戏音乐 ogg: ...
- 2017/6Summary
字符串转换为JSON 1.var json = eval('(' + str + ')'); 2.var json = (new Function("return " + str) ...
- MindMaster学习笔记
参考博客 http://blog.sina.com.cn/u/6406591976 作者名叫“MindMaster思维导图的博客 ”写了一系列关于思维导图的博客,可以去学习下. 1.其中有一篇比较详细 ...
- 使用.NET向webService传double、int、DateTime 服务器得到的数据时null的问题(转http://blog.csdn.net/slimboy123/article/details/4366701)
用C#.NET调用Java开发的WebService时,先在客户端封装的带有int属性的对象,当将该对象传到服务器端时,服务器端可以得到string类型的属性值,却不能得到int类型.double和D ...