莫队算法,离线回答询问,按一定大小(sqrt(n*log(n))左右)将答案分块,按 ①左端点所在块②右端点 双关键字排序。

然后暴力转移。

转移的时候用树状数组。

O(n*sqrt(n)*log(n))。

注意:①在一列数的后面添加一个数,逆序对数会增加 数列中比它大的数的个数。

②在一列数的后面删除一个数,逆序对数会减少 数列中比它大的数的个数。

③在一列数的前面添加一个数,逆序对数会增加 数列中比它小的数的个数。

④在一列数的前面删除一个数,逆序对数会减少 数列中比它小的数的个数。

 #include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
struct Point{int x,y;}a[];
struct ASK{int l,r,lb,p;}Q[];
bool operator < (const ASK &a,const ASK &b){return a.lb!=b.lb ? a.lb<b.lb : a.r<b.r;}
bool operator < (const Point &a,const Point &b){return a.x<b.x;}
int n,m,sz,sum,num[],b[],cnt;
int d[],ans[],res;
inline int lowbit(const int &x){return x&(-x);}
inline void add(int p,const int &x){while(p<=n){d[p]+=x;p+=lowbit(p);}}
inline int getsum(int p){int res=;while(p){res+=d[p];p-=lowbit(p);}return res;}
int Res,Num;char C,CH[];
inline int G()
{
Res=;C='*';
while(C<''||C>'')C=getchar();
while(C>=''&&C<=''){Res=Res*+(C-'');C=getchar();}
return Res;
}
inline void P(long long x)
{
Num=;if(!x){putchar('');puts("");return;}
while(x>)CH[++Num]=x%,x/=;
while(Num)putchar(CH[Num--]+);
puts("");
}
void makeblock()
{
sz=sqrt((double)n*4.6); int L,R;
for(sum=;sum*sz<n;sum++)
{
L=(sum-)*sz+; R=sum*sz;
for(int i=L;i<=R;i++) num[i]=sum;
}
L=sz*(sum-)+; R=n;
for(int i=L;i<=R;i++) num[i]=sum;
}
void LiSan()
{
int en=; sort(a+,a+n+); b[a[].y]=;
for(int i=;i<=n;i++)
{
if(a[i].x!=a[i-].x) en++;
b[a[i].y]=en;
}
}
int main()
{
n=G();
for(int i=;i<=n;i++)
{
a[i].x=G();
a[i].y=i;
}
makeblock(); LiSan(); m=G();
for(int i=;i<=m;i++)
{
Q[i].l=G(); Q[i].r=G();
Q[i].lb=num[Q[i].l];
Q[i].p=i;
}
sort(Q+,Q+m+);
for(int i=Q[].l;i<=Q[].r;i++)
{
cnt++;
add(b[i],);
res+=(cnt-getsum(b[i]));
} ans[Q[].p]=res;
for(int i=;i<=m;i++)
{
if(Q[i].l<Q[i-].l)
{
for(int j=Q[i-].l-;j>=Q[i].l;j--)
{
res+=getsum(b[j]-);
add(b[j],);
}
cnt+=(Q[i-].l-Q[i].l);
}
else
{
for(int j=Q[i-].l;j<Q[i].l;j++)
{
res-=getsum(b[j]-);
add(b[j],-);
}
cnt-=(Q[i].l-Q[i-].l);
}
if(Q[i].r<Q[i-].r)
{
for(int j=Q[i-].r;j>Q[i].r;j--)
{
res-=(cnt-getsum(b[j]));
cnt--;
add(b[j],-);
}
}
else
{
for(int j=Q[i-].r+;j<=Q[i].r;j++)
{
cnt++;
add(b[j],);
res+=(cnt-getsum(b[j]));
}
}
ans[Q[i].p]=res;
}
for(int i=;i<=m;i++) P(ans[i]);
return ;
}

【莫队算法】bzoj3289 Mato的文件管理的更多相关文章

  1. 【BZOJ3289】Mato的文件管理 莫队算法+树状数组

    [BZOJ3289]Mato的文件管理 Description Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号.为了防止他人偷拷,这些资料都是 ...

  2. 【bzoj3289】Mato的文件管理 离散化+莫队算法+树状数组

    原文地址:http://www.cnblogs.com/GXZlegend/p/6805224.html 题目描述 Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份 ...

  3. BZOJ3289 Mato的文件管理(莫队算法+树状数组)

    题目是区间逆序数查询. 莫队算法..左或右区间向左或右延伸时加或减这个区间小于或大于新数的数的个数,这个个数用树状数组来统计,我用线段树超时了.询问个数和数字个数都记为n,数字范围不确定所以离散化,这 ...

  4. BZOJ3289 Mato的文件管理 【莫队 + 树状数组】

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MB Submit: 3964  Solved: 1613 [Submit][Status] ...

  5. bzoj 3289 Mato的文件管理(莫队算法+BIT)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3289 [题意] 回答若干个询问:[l,r]区间内的逆序对个数. [思路] 莫队算法,B ...

  6. BZOJ 3289:Mato的文件管理(莫队算法+树状数组)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3289 题意:…… 思路:求交换次数即求逆序对数.确定了这个之后,先离散化数组.然后在后面插入元素的话 ...

  7. 数据离散化 ( 以及 stl 中的 unique( ) 的用法 )+ bzoj3289:Mato的文件管理

    http://blog.csdn.net/gokou_ruri/article/details/7723378 ↑惯例Mark大神的博客   bzoj3289:Mato的文件管理 线段树求逆序对+莫队 ...

  8. 莫队算法 ( MO's algorithm )

    莫队算法是由清华大学神牛莫涛发明的一种处理区间问题的离线算法 算法核心是通过先将问询区间总长度平方分块.然后将所有的问询区间按照左端点所在的块编号排序.在同一块内的则按右端点升序 然后设置左右两个下标 ...

  9. [bzoj3289]Mato的文件管理

    Description Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号.为了防止他人偷拷,这些资料都是加密过的,只能用Mato自己写的程序才能 ...

随机推荐

  1. Codeforces Round #348 (VK Cup 2016 Round 2, Div. 2 Edition) A

    A. Little Artem and Presents time limit per test 2 seconds memory limit per test 256 megabytes input ...

  2. POJ1637:Sightseeing tour(混合图的欧拉回路)

    Sightseeing tour Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 10581   Accepted: 4466 ...

  3. Socket和ServerSocket学习笔记

    对于即时类应用或者即时类的游戏,HTTP协议很多时候无法满足于我们的需求.这会,Socket对于我们来说就非常实用了.下面是本次学习的笔记.主要分异常类型.交互原理.Socket.ServerSock ...

  4. [CVPR2017]Online Video Object Segmentation via Convolutional Trident Network

    基于三端卷积网络的在线视频目标分割 针对半监督视频目标分割任务,作者采取了和MaskTrace类似的思路,以optical flow为主. 本文亮点在于: 1. 使用共享backbone,三输出的自编 ...

  5. NET中IL理解(转)

    .NET CLR 和 Java VM 都是堆叠式虚拟机器(Stack-Based VM),也就是說,它們的指令集(Instruction Set)都是採用堆叠运算的方式:执行时的资料都是先放在堆叠中, ...

  6. 动态规划:高维DP

    例子当然是王八棋这道题,这道题以前是写烂了 先来一个大暴力,zlw教的暴力~~ #include<iostream> using namespace std; ,maxm=; ]; int ...

  7. Idea导入的工程看不到src等代码

    问题描述: 从其他地方拷贝过来的工程,在本地导入到idea中时,展示如下的页面,里面的其他文件都看不到. 解决办法:(不知道是具体的什么原因引起的) 1. 关闭IDEA, 2.然后删除项目文件夹下的. ...

  8. [POJ1637]混合图的欧拉回路判定|网络流

    混合图的欧拉回路判定 上一篇正好分别讲了有向图和无向图的欧拉回路判定方法 如果遇上了混合图要怎么做呢? 首先我们思考有向图的判定方法:所有点的出度=入度 我们可以先为无向边任意定一个向,算出此时所有顶 ...

  9. [BZOJ1151][CTSC2007]动物园zoo 解题报告|DP|位运算

    Description 最近一直在为了学习算法而做题,这道题是初一小神犇让我看的.感觉挺不错于是写了写. 这道题如果是一条线的话我们可以构造一个DP f[i,j]表示以i为起点,i,i+1...i+4 ...

  10. jupyter、flask、tornado、djiango安装

    安装了pip包的话直接使用: 1.安装jupyter:pip install jupyter 2.安装flask: pip install flask 3.安装tornado:pip install ...