UVA 11990 ”Dynamic“ Inversion(线段树+树状数组)
【题目链接】 UVA11990
【题目大意】
给出一个数列,每次删去一个数,求一个数删去之前整个数列的逆序对数。
【题解】
一开始可以用树状数组统计出现的逆序对数量
对于每个删去的数,我们可以用线段树求出它在原序列中的逆序对贡献
在线段树的每个区间有序化数据,就可以二分查找出这个数在每个区间的位置,
这样就处理出了划分出的区间的贡献,先用答案减去这一部分
接下来考虑已经删去部分的容斥,我们发现只要对删去部分再做一次类似的操作,
将这一部分跟当前删去数求一次贡献就是刚才多减去的部分,将这部分的答案再加回去。
这个可以在线段树上查找的同时用树状数组维护。
这样子就能处理每一次的删数操作了。
【代码】
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=200010;
int n,m,c[30][N],a[30][N],arr[N],id[N];
long long ans;
void add(int c[],int x,int v,int n){while(x<=n)c[x]+=v,x+=x&-x;}
int sum(int c[],int x,int n=0){int s=0;while(x>n)s+=c[x],x-=x&-x;return s;}
void build(int x,int l,int r,int d){
int mid=(l+r)>>1;
for(int i=l;i<=r;i++)a[d][i]=a[d-1][i],c[d][i]=0;
if(l==r)return;
build(x<<1,l,mid,d+1);
build(x<<1|1,mid+1,r,d+1);
sort(a[d]+l,a[d]+r+1);
}
int find(int L,int R,int d,int v){
int l=L,r=R;
while(l<r){
int mid=(l+r)>>1;
if(a[d][mid]>=v)r=mid;
else l=mid+1;
}if(a[d][l]>v)l--;
return l;
}
void query(int x,int l,int r,int L,int R,int v,int d,int f){
int mid=(l+r)>>1;
if(L<=l&&r<=R){
int k=find(l,r,d,v),t=sum(c[d],k,l-1);
if(!f){k=r-k;t=sum(c[d],r,l-1)-t;}
else k-=l-1;
ans-=k-t; return;
}if(l>=r)return;
if(L<=mid)query(x<<1,l,mid,L,R,v,d+1,f);
if(R>mid)query(x<<1|1,mid+1,r,L,R,v,d+1,f);
}
void update(int x,int l,int r,int s,int v,int d){
int mid=(l+r)>>1;
if(l==r){add(c[d],l,1,r);return;}
if(l>=r)return;
if(s<=mid)update(x<<1,l,mid,s,v,d+1);
else update(x<<1|1,mid+1,r,s,v,d+1);
int k=find(l,r,d,v);
add(c[d],k,1,r);
}
int main(){
while(~scanf("%d%d",&n,&m)){
ans=0; memset(arr,0,sizeof(arr));
for(int i=1;i<=n;i++){
scanf("%d",&a[0][i]); id[a[0][i]]=i;
ans+=i-1-sum(arr,a[0][i]);
add(arr,a[0][i],1,n);
}build(1,1,n,1);
while(m--){
int k;
scanf("%d",&k);
printf("%lld\n",ans);
if(ans){
query(1,1,n,1,id[k]-1,k,1,0);
query(1,1,n,id[k]+1,n,k,1,1);
update(1,1,n,id[k],k,1);
}
}
}return 0;
}
UVA 11990 ”Dynamic“ Inversion(线段树+树状数组)的更多相关文章
- UVA 11990 `Dynamic'' Inversion CDQ分治, 归并排序, 树状数组, 尺取法, 三偏序统计 难度: 2
题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...
- UVA 11990 ``Dynamic'' Inversion 动态逆序对
``Dynamic'' Inversion Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 https://uva.onlinejudge.org/index ...
- UVA 11990 ``Dynamic'' Inversion (序列分治)
26天以前做过的一道题,之前的做法是分治预处理,树套树在线修改,复杂度为O(nlogn+m*logn*logn),代码量较大. 本来想学习一下cdq分治的,看到论文上的凸包.斜率就暂时放一边了,只知道 ...
- UVA 11990 ``Dynamic'' Inversion (线段树套BIT,分治)
题目要求可转化为查询一个区间内有多少数比val大(或者小). 区间用线段树分解(logN),每个区间维护一rank树. rank可用BIT查询,往BIT里面插值,为了保证不同区间的BIT互不影响要先离 ...
- CodeForces -163E :e-Government (AC自动机+DFS序+树状数组)
The best programmers of Embezzland compete to develop a part of the project called "e-Governmen ...
- [bzoj1901][zoj2112][Dynamic Rankings] (整体二分+树状数组 or 动态开点线段树 or 主席树)
Dynamic Rankings Time Limit: 10 Seconds Memory Limit: 32768 KB The Company Dynamic Rankings has ...
- HDU 1394 Minimum Inversion Number(最小逆序数/暴力 线段树 树状数组 归并排序)
题目链接: 传送门 Minimum Inversion Number Time Limit: 1000MS Memory Limit: 32768 K Description The inve ...
- HDU 1394 Minimum Inversion Number(线段树/树状数组求逆序数)
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- bzoj 1901 Dynamic Rankings (树状数组套线段树)
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MB Description 给定一个含有n个数的序列a[1] ...
随机推荐
- Python学习3,列表
列表就是能够包含几个或者上千上万个元素,对我这种新手来说应该是最重要的了! _author_ = "Happyboy" shopping = ['Iphone','Huawei', ...
- centos7系列问题
一.CentOS7.1查看ip route有两条路由规则 1.metric值是指到达目的地需要的跳数,是表达该条路由连接质量的指标.当有多条到达相同目的地的路由记录时,路由器会采用metric值小的那 ...
- 平衡二叉树(AVL)
AVL就是优化二叉查找树 平衡因子不大于1 左 < 根 < 右 具体看代码 #include<bits/stdc++.h> using namespace std; typed ...
- SpringBoot Rabbitmq发送消息
官方文档:https://docs.spring.io/spring-boot/docs/2.1.3.RELEASE/reference/htmlsingle/#boot-features-amqp ...
- 团队冲刺Alpha(七)
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...
- Java性能监控之Java程序执行解析
大家好,最近接触javassist技术,研究过程中对Java程序执行过程进行了一系列探索,弄清楚了几个盲区(仅针对个人而言),现将经验与大家分享. 1.编码->.java 通常指写代码的过程,最 ...
- 分享下自己一直用的.NET SQLSERVER 封装类下自己写的DataHelper 操作类
一,概述: 这个DataHelper 类是基于我上个博客里发的SQLDataAccess 这个类做的一个简单的封装,为了结合自己的实体类和数据操作而产生的. 这里面用了 属性类,反射.还有 数据类型 ...
- 刷题总结——Interval query(hdu4343倍增+贪心)
题目: Problem Description This is a very simple question. There are N intervals in number axis, and M ...
- JavaScript各变量类型的判断方法
我们很容易被漂亮的代码吸引,也不知不觉的在自己的代码库中加入这些.却没有冷静的想过它们的优劣.这不,我就收集了一系列形如 "是否为……?" 的判断的boolean函数. isNul ...
- 《c程序设计语言》读书笔记-5.6-指针重写getline等函数
#include <stdio.h> #include <math.h> #include <stdlib.h> #include <string.h> ...