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]动态逆序对(树状数组套线段树)的更多相关文章

  1. 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[ ...

  2. BZOJ 1901 Zju2112 Dynamic Rankings 树状数组套线段树

    题意概述:带修改求区间第k大. 分析: 我们知道不带修改的时候直接上主席树就可以了对吧?两个版本号里面的节点一起走在线段树上二分,复杂度是O((N+M)logN). 然而这里可以修改,主席树显然是凉了 ...

  3. [APIO2019] [LOJ 3146] 路灯 (cdq分治或树状数组套线段树)

    [APIO2019] [LOJ 3146] 路灯 (cdq分治或树状数组套线段树) 题面 略 分析 首先把一组询问(x,y)看成二维平面上的一个点,我们想办法用数据结构维护这个二维平面(注意根据题意这 ...

  4. bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1384  Solved: 629[Submit][Stat ...

  5. [BZOJ 3196] 213平衡树 【线段树套set + 树状数组套线段树】

    题目链接:BZOJ - 3196 题目分析 区间Kth和区间Rank用树状数组套线段树实现,区间前驱后继用线段树套set实现. 为了节省空间,需要离线,先离散化,这样需要的数组大小可以小一些,可以卡过 ...

  6. [BZOJ 1901] Dynamic Rankings 【树状数组套线段树 || 线段树套线段树】

    题目链接:BZOJ - 1901 题目分析 树状数组套线段树或线段树套线段树都可以解决这道题. 第一层是区间,第二层是权值. 空间复杂度和时间复杂度均为 O(n log^2 n). 线段树比树状数组麻 ...

  7. bzoj3196 二逼平衡树 树状数组套线段树

    题目传送门 思路:树状数组套线段树模板题. 什么是树状数组套线段树,普通的树状数组每个点都是一个权值,而这里的树状数组每个点都是一颗权值线段树,我们用前缀差分的方法求得每个区间的各种信息, 其实关键就 ...

  8. 【序列操作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 ...

  9. 2019南昌网络赛  I. Yukino With Subinterval 树状数组套线段树

    I. Yukino With Subinterval 题目链接: Problem Descripe Yukino has an array \(a_1, a_2 \cdots a_n\). As a ...

随机推荐

  1. [LeetCode] questions conclusion_ Binary Search

    Binary Search T(n) = T(n/2) + O(1)   =>    T(n) = O(lg n) proof: 如果能用iterable , 就用while loop, 可以防 ...

  2. BindIPEndPointDelegate

    开发人员经常会碰到老板或上头安排的项目或需求,是自己完全陌生的领域,这个时候就会非常头痛,搜索引擎能解决大部分这些方面的问题,而有时因为自身问题或干脆找不到解决方案而非常抓狂......虽然干开发有1 ...

  3. css3--之backface-visibility

    使用CSS3 backface-visibility属性制作翻转动画效果:    http://www.htmleaf.com/ziliaoku/qianduanjiaocheng/201504151 ...

  4. java集合框架中Set和List的区别

    1. Set 接口实例存储的是无序的,不重复的数据.List 接口实例存储的是有序的,可以重复的元素. 2. Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 <实现类有Ha ...

  5. cocos2d-x android工程接入第三方支付宝SDK

    1. 首先去支付宝官网下载开发者文档 2. 然后按着开发者文档将支付宝的sdk导入到你的工程中,并关联到工程中,步骤入下图: (1)将从支付宝官方网站获得的支付宝的sdk的jar包拷贝到工程中的lib ...

  6. 用int还是用Integer?

    昨天例行code review时大家有讨论到int和Integer的比较和使用. 这里做个整理,发表一下个人的看法.   [int和Integer的区别] int是java提供的8种原始类型之一,ja ...

  7. jQuery清除数组中的空值

    var aa = ["12", "34", "", "423", " "];   console.l ...

  8. 如何使用Apache log4net库与ASP.NET MVC 5日志记录

    在运行软件程序的时候,跟踪和监控日志是一种记录过程的好方法. 简介: 在运行软件程序的时候,跟踪和监控日志是一种记录过程的好方法.尤其在应用程序出错的时候,日志是我们最需要的文件.不管是在web,wi ...

  9. 关于c语言中的program_invocation_short_name

    错误源自用g++的交叉编译工具链编译eudev.经过一番查找,发现在 errno.h 这个头文件中有 program_invocation_short_name 的 extern 定义. 经过查看 e ...

  10. leetCodeReorderList链表合并

    原题 Given a singly linked list L: L0?L1?-?Ln-1?Ln, reorder it to: L0?Ln?L1?Ln-1?L2?Ln-2?- You must do ...