Bzoj 3295: [Cqoi2011]动态逆序对 分块,树状数组,逆序对
3295: [Cqoi2011]动态逆序对
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 2886 Solved: 924
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1
5
3
4
2
5
1
4
2
Sample Output
2
2
1
样例解释
(1,5,3,4,2)(1,3,4,2)(3,4,2)(3,2)(3)。
HINT
N<=100000 M<=50000
Source
#include<bits/stdc++.h>
using namespace std;
#define MAXN 100010
#define LL long long
int pos[MAXN],BIT[MAXN],a[MAXN],b[MAXN],wz[MAXN],block,n;
LL ans;
int read()
{
int s=,fh=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')fh=-;ch=getchar();}
while(ch>=''&&ch<=''){s=s*+(ch-'');ch=getchar();}
return s*fh;
}
int Lowbit(int o){return o&(-o);}
void Update(int o,int o1)
{
while(o<=n)
{
BIT[o]+=o1;
o+=Lowbit(o);
}
}
int Sum(int o)
{
int sum=;
while(o>)
{
sum+=BIT[o];
o-=Lowbit(o);
}
return sum;
}
void cl(int k)
{
int l=(k-)*block+,r=min(k*block,n),i;
for(i=l;i<=r;i++)b[i]=a[i];
sort(b+l,b+r+);
}
int ef(int k,int k1)//在第k块中寻找大于k1的第一个位置.
{
int l=(k-)*block+,r=min(k*block,n),ans1;
ans1=-;
while(l<=r)
{
int mid=(l+r)/;
if(b[mid]>k1){ans1=mid;r=mid-;}
else l=mid+;
}
return ans1;
}
int ef1(int k,int k1)
{
int l=(k-)*block+,r=min(k*block,n),ans1;
ans1=-;
while(l<=r)
{
int mid=(l+r)/;
if(b[mid]<k1){ans1=mid;l=mid+;}
else r=mid-;
}
return ans1;
}
void calc1(int l,int r,int D)
{
if(l>r)return;
int L=pos[l],R=pos[r],i,pd;
if(L==R)
{
for(i=l;i<=r;i++)if(a[i]>D&&a[i]!=-)ans--;
return;
}
for(i=l;i<=L*block;i++)if(a[i]>D&&a[i]!=-)ans--;
for(i=L+;i<=R-;i++)
{
pd=ef(i,D);
if(pd!=-)ans-=(LL)(min(i*block,n)-pd+);
}
//ans-=(ef(i,D)-ef(i,0)+1);
for(i=(R-)*block+;i<=r;i++)if(a[i]>D&&a[i]!=-)ans--;
}
void calc2(int l,int r,int D)
{
if(l>r)return;
int L=pos[l],R=pos[r],i,pd,pd1;
if(L==R)
{
for(i=l;i<=r;i++)if(a[i]<D&&a[i]!=-)ans--;
return;
}
for(i=l;i<=L*block;i++)if(a[i]<D&&a[i]!=-)ans--;
for(i=L+;i<=R-;i++)
{
//ans-=(ef1(i,D)-ef(i,0)+1);
pd=ef1(i,D);
if(b[pd]!=-)
{
pd1=ef(i,);
if(pd!=-)
{
if(pd1==-)pd1=;
ans-=(LL)(pd-pd1+);
}
}
}
for(i=(R-)*block+;i<=r;i++)if(a[i]<D&&a[i]!=-)ans--;
}
int main()
{
freopen("inverse.in","r",stdin);
freopen("inverse.out","w",stdout);
int m,i,M,del;
n=read();m=read();
for(i=;i<=n;i++)a[i]=read(),wz[a[i]]=i;
block=(int)sqrt(n);
for(i=;i<=n;i++)pos[i]=(int)(i-)/block+;
if(n%block==)M=n/block;
else M=n/block+;
memset(BIT,,sizeof(BIT));ans=;
for(i=n;i>=;i--)
{
ans+=Sum(a[i]-);
Update(a[i],);
}
for(i=;i<=M;i++)cl(i);
for(i=;i<=m;i++)
{
del=read();
printf("%lld\n",ans);
calc1(,wz[del]-,del);//去寻找 从位置1到要删除的数前一个位置 中有多少个数大于要删除的数,并把个数减去.
calc2(wz[del]+,n,del);//去寻找 从要删除的数后一个位置到位置n 中有多少个数小于要删除的数,并把个数减去.
a[wz[del]]=-;
cl(pos[wz[del]]);
//printf("%d\n",ans);
}
fclose(stdin);
fclose(stdout);
return ;
}
Bzoj 3295: [Cqoi2011]动态逆序对 分块,树状数组,逆序对的更多相关文章
- 【BZOJ 3295】动态逆序对 - 分块+树状数组
题目描述 给定一个1~n的序列,然后m次删除元素,每次删除之前询问逆序对的个数. 分析:分块+树状数组 (PS:本题的CDQ分治解法见下一篇) 首先将序列分成T块,每一块开一个树状数组,并且先把最初的 ...
- Bzoj 3289: Mato的文件管理 莫队,树状数组,逆序对,离散化,分块
3289: Mato的文件管理 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 1539 Solved: 665[Submit][Status][Di ...
- BZOJ 3744 Gty的妹子序列 (分块+树状数组+主席树)
题面传送门 题目大意:给你一个序列,多次询问,每次取出一段连续的子序列$[l,r]$,询问这段子序列的逆序对个数,强制在线 很熟悉的分块套路啊,和很多可持久化01Trie的题目类似,用分块预处理出贡献 ...
- BZOJ 3744 Gty的妹子序列 分块+树状数组
具体分析见 搬来大佬博客 时间复杂度 O(nnlogn)O(n\sqrt nlogn)O(nnlogn) CODE #include <cmath> #include <cctyp ...
- [树状数组+逆序对][NOIP2013]火柴排队
火柴排队 题目描述 涵涵有两盒火柴,每盒装有n根火柴,每根火柴都有一个高度.现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:∑ (ai-bi)2,i=1,2,3,. ...
- AcWing 107. 超快速排序(归并排序 + 逆序对 or 树状数组)
在这个问题中,您必须分析特定的排序算法----超快速排序. 该算法通过交换两个相邻的序列元素来处理n个不同整数的序列,直到序列按升序排序. 对于输入序列9 1 0 5 4,超快速排序生成输出0 1 4 ...
- 【bzoj2141】排队 分块+树状数组
题目描述 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的身高有所区别, ...
- 【bzoj3744】Gty的妹子序列 分块+树状数组+主席树
题目描述 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见…… 某天,蒟蒻Autumn发现了从 Gty的妹子树(bzoj3720) 上掉落下来了许多妹子,他发现 她们排成 ...
- 【分块+树状数组】codechef November Challenge 2014 .Chef and Churu
https://www.codechef.com/problems/FNCS [题意] [思路] 把n个函数分成√n块,预处理出每块中各个点(n个)被块中函数(√n个)覆盖的次数 查询时求前缀和,对于 ...
随机推荐
- GitCam一款Gif动画制作软件
本篇文章由:http://www.sollyu.com/gitcam-a-gif-animation-software/ 说明 GifCam是一款小巧.免费的录制电脑屏幕并制作成GIF动画的软件,具有 ...
- skip跳跃表的实现
skiplist介绍 跳表(skip List)是一种随机化的数据结构,基于并联的链表,实现简单,插入.删除.查找的复杂度均为O(logN).跳表的具体定义, 跳表是由William Pugh发明的, ...
- mysql远程连接缓慢的问题
这两天发现服务器程序启动的时候到了mysql初始连接的那一步很耗时,启动缓慢,后来发现,将连接的主机的-h参数改成localhost的时候 瞬间就完成连接了.后来在网上查到,原来是由于mysql服务器 ...
- apache的MPM机制-prefork
apache是基于模块化设计的. 关于基础的服务,也采用了模块化的设计,但是这个模块是具有排他性的,同一时间只能有一个得到调用. MPM模块(multi processing module) 多处理模 ...
- couchDB入门
无意翻到一本新书<CouchDB权威指南> 发现这就是传说中的NoSQL,看排第一的是mangodb,redis有些人说是,有些人说不是. CouchDB的开发很天才,直接可以通过java ...
- html定义对象
<object>定义一个对象<param>为对象定义一个参数 参数的名称:name = "" 参数的值:value=""classid: ...
- PHP文件下载方式
<?php// 不能是中文目录,其实如果是 .rar, .zip 类的这些文件,直接连接就可以下载了!function download($file_dir,$file_name)//参数说明: ...
- #Leet Code# Sqrt
描述:log(n) 代码: class Solution: # @param x, an integer # @return an integer def getVal(self, begin, en ...
- JavaBean的使用
JavaBean主要用于实现一些业务逻辑或封装一些业务对象 通常将JavaBean中的属性设置为私有的(private),但需要为其提供公共的(public)访问方法,也就是所说的getXXX()方法 ...
- 十分钟了解MVVMLight
十分钟了解MVVMLight 前言: 最近看了看开源框架MVVMLight,一直想写一点笔记,但是文笔欠佳,索性就放弃了.那就来翻译一点文章吧. 由于英文水平和技术水平有限,凡是不妥之处,请大家指 ...