bzoj3295 动态逆序对
Description
Input
Output
将原数列建立归并树,归并树每个节点记录区间排序后结果、被删除的数的个数、树状数组记录前i个数被删了几个,每删除一个数前查找左边比它大的数和右边比它小的数的个数并更新答案。
#include<cstdio>
#include<algorithm>
inline int read(){
int x=,c=getchar();
while(c>||c<)c=getchar();
while(c>&&c<)x=x*+c-,c=getchar();
return x;
}
inline void mins(int&a,int b){if(a>b)a=b;}
inline void maxs(int&a,int b){if(a<b)a=b;}
long long ans=;
int t[],v[],id[];
int vs[][],bit[][],dt[][];
int X,v0;
void build(int L,int R,int h=){
int*x=vs[h];
if(L<R){
int M=L+R>>;
build(L,M,h+);
build(M+,R,h+);
int p1=L,p2=M+,*p3=x+L,*y=vs[h+];
while(p1<=M&&p2<=R)*(p3++)=y[(y[p1]<y[p2]?p1:p2)++];
while(p1<=M)*(p3++)=y[p1++];
while(p2<=R)*(p3++)=y[p2++];
}else x[L]=v[L];
}
void s1(int L,int R,int h=){
int*x=vs[h];
if(R<X){
int p=std::upper_bound(x+L,x+R+,v0)-(x+L);
ans-=R+-L-p;
for(int*a=bit[h]+L-;p;p-=p&-p)ans-=a[p];
ans+=dt[h][L];
return;
}
if(L!=R){
int M=L+R>>;
s1(L,M,h+);
if(X->M)s1(M+,R,h+);
}
}
void s2(int L,int R,int h=){
int*x=vs[h];
if(X<L){
int p=std::lower_bound(x+L,x+R+,v0)-(x+L);
ans-=p;
for(int*a=bit[h]+L-;p;p-=p&-p)ans+=a[p];
return;
}
if(L!=R){
int M=L+R>>;
if(X<M)s2(L,M,h+);
s2(M+,R,h+);
}
}
void del(int L,int R,int h=){
int*x=vs[h];
++dt[h][L];
int p=std::lower_bound(x+L,x+R+,v0)-(x+L)+;
for(int*a=bit[h]+L-,N=R-L+;p<=N;p+=p&-p)++a[p];
if(L!=R){
int M=L+R>>;
if(X<=M)del(L,M,h+);
else del(M+,R,h+);
}
}
int n,m;
int main(){
n=read();m=read();
for(int i=,a;i<=n;i++){
v[i]=a=read();
id[a]=i;
ans+=i-;
for(int w=a;w;w-=w&-w)ans-=t[w];
while(a<=n)++t[a],a+=a&-a;
}
build(,n);
for(int i=;i<=m;i++){
printf("%lld\n",ans);
v0=read();
X=id[v0];
s1(,n);
s2(,n);
del(,n);
}
return ;
}
bzoj3295 动态逆序对的更多相关文章
- BZOJ3295 动态逆序对(树状数组套线段树)
[Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6058 Solved: 2117[Submit][Status][D ...
- BZOJ3295动态逆序对
一道比较傻的CDQ分治 CDQ: 主要用于解决三位偏序的问题 #include<cstdio> #include<cctype> #include<algorithm&g ...
- 【BZOJ3295】动态逆序对(线段树,树状数组)
[BZOJ3295]动态逆序对(线段树,树状数组) 题面 Description 对于序列A,它的逆序对数定义为满足iAj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的 ...
- 【BZOJ3295】[Cqoi2011]动态逆序对 cdq分治
[BZOJ3295][Cqoi2011]动态逆序对 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依 ...
- bzoj3295 [Cqoi2011]动态逆序对 cdq+树状数组
[bzoj3295][Cqoi2011]动态逆序对 2014年6月17日4,7954 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数. ...
- bzoj3295 洛谷P3157、1393 动态逆序对——树套树
题目:bzoj3295 https://www.lydsy.com/JudgeOnline/problem.php?id=3295 洛谷 P3157(同一道题) https://www.luogu.o ...
- 【题解】动态逆序对 [CQOI2011] [P3157] [BZOJ3295] [P1393]
[题解]动态逆序对 [CQOI2011] [P3157] [BZOJ3295] [P1393] 水一水QAQ 题目链接: \([P3157]\) \([BZOJ3295]\) [题目描述] 对于一个序 ...
- [bzoj3295][Cqoi2011]动态逆序对_主席树
动态逆序对 bzoj-3295 Cqoi-2011 题目大意:题目链接. 注释:略. 想法:直接建立主席树. 由于是一个一个删除,所以我们先拿建立好的root[n]的权值线段树先把总逆序对求出来,接着 ...
- bzoj3295[Cqoi2011]动态逆序对 树套树
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 5987 Solved: 2080[Submit][Sta ...
随机推荐
- Oracle sqlloader
一.SQL*LOADER简介 SQL*Loader是oracle提供的可以从多种平面文件中向数据库中加载数据的工具,使用sqlldr工具可以在很短的时间内向数据库中加载大量的数据,像把制作好的exce ...
- EhLib TitleButton SVisibleColumnsEh = '错误的列';
unit EhLibConsts; interface resourcestring SClearSelectedCellsEh = '清除选择的单元?'; SInvalidTextFormatEh ...
- spring aop 的理解
spring aop的相关概念(所有的概念都是为了生成代理类这个过程所需要的信息的抽象): 1.Targer:目标对象.被代理的对象. 2.Advice:增强/通知.就是为目标对象扩展的功能.分为前置 ...
- Java——线程池
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- c#版本与vs的对应关系
版本 .NET Framework版本 Visual Studio版本 发布日期 特性 C# 1.0 .NET Framework 1.0 Visual Studio .NET 2002 2002.1 ...
- html邮件链接和锚点链接
锚点链接: 锚点链接: 标记:<a name="XXX"></a> 取读:<a href="#XXX"></a> ...
- Unity5.X 新版AssetBundle使用方案及策略
1.概览 Unity3D 5.0版本之后的AssetBundle机制和之前的4.x版本已经发生了很大的变化,一些曾经常用的流程已经不再使用,甚至一些老的API已经被新的API所取代. 因此,本文的主要 ...
- 缓存ehcache
应用场景: 当调用一个接口数据时:直连-缓存-数据库-远程调用(类似直连) 代码: // 从缓存 通过身份证号码查询是否存在征信报告 CisReportRoot fromCache = cacheSe ...
- 可远程定位、解锁并启动汽车的黑客设备OwnStar
GM告诉WIRED,OnStar用户不必担心之前存在的问题,现在已经修复了之前可被利用的漏洞,. 然而,Kamkar表示问题还是没有被解决,并且已经由GM汇报了该问题. 在任何已经连接的汽车上,GM的 ...
- python使用opencv驱动摄像头
#coding:utf-8 import cv2 import sys from PIL import Image def CatchUsbVideo(window_name, camera_idx) ...