3289: Mato的文件管理

Time Limit: 40 Sec  Memory Limit: 128 MB
Submit: 1539  Solved: 665
[Submit][Status][Discuss]

Description

Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号。为了防止他人偷拷,这些资料都是加密过的,只能用Mato自己写的程序才能访问。Mato每天随机选一个区间[l,r],他今天就看编号在此区间内的这些资料。Mato有一个习惯,他总是从文件大小从小到大看资料。他先把要看的文件按编号顺序依次拷贝出来,再用他写的排序程序给文件大小排序。排序程序可以在1单位时间内交换2个相邻的文件(因为加密需要,不能随机访问)。Mato想要使文件交换次数最小,你能告诉他每天需要交换多少次吗?

Input

第一行一个正整数n,表示Mato的资料份数。
第二行由空格隔开的n个正整数,第i个表示编号为i的资料的大小。
第三行一个正整数q,表示Mato会看几天资料。
之后q行每行两个正整数l、r,表示Mato这天看[l,r]区间的文件。

Output

q行,每行一个正整数,表示Mato这天需要交换的次数。

Sample Input

4
1 4 2 3
2
1 2
2 4

Sample Output

0
2

HINT

Hint

n,q <= 50000

样例解释:第一天,Mato不需要交换

第二天,Mato可以把2号交换2次移到最后。

Source

By taorunz

题解:

多次查询,不修改,一看就是莫队。。。

每次交换相邻的元素,这不是逆序对吗。。。

于是,直接胡搞一个莫队+逆序对。。。

逆序对可以用树状数组维护,可以看一下我的上一篇博客http://www.cnblogs.com/Var123/p/5300334.html

Poj 2299就是求逆序对。(可以先做一下)

1A了很开心。。。

 #include<bits/stdc++.h>
using namespace std;
#define MAXN 50010
int N,sz[MAXN],color[MAXN],BIT[MAXN],pos[MAXN],ans1[MAXN];
struct node
{
int l,r,id;
}q[MAXN];
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;
}
bool cmp(node aa,node bb)
{
if(pos[aa.l]==pos[bb.l])return aa.r<bb.r;
return aa.l<bb.l;
}
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;
}
int main()
{
int L,R,Q,i,ans,block,wz,tot;
N=read();
for(i=;i<=N;i++)sz[i]=read(),color[i]=sz[i];
sort(sz+,sz+N+);
tot=unique(sz+,sz+N+)-(sz+);
block=(int)sqrt(N);
Q=read();
for(i=;i<=Q;i++)
{
q[i].l=read();q[i].r=read();q[i].id=i;
}
for(i=;i<=N;i++)pos[i]=(int)(i-)/block+;
L=;R=;memset(BIT,,sizeof(BIT));
sort(q+,q+Q+,cmp);
ans=;
memset(ans1,,sizeof(ans1));
for(i=;i<=Q;i++)
{
while(L<q[i].l)
{
wz=lower_bound(sz+,sz+tot+,color[L])-sz;
Update(wz,-);
ans-=Sum(wz-);
L++;
//Update(wz,-1);
}
while(L>q[i].l)
{
L--;
wz=lower_bound(sz+,sz+tot+,color[L])-sz;
ans+=Sum(wz-);
Update(wz,);
}
while(R<q[i].r)
{
R++;
wz=lower_bound(sz+,sz+tot+,color[R])-sz;
ans+=(Sum(N)-Sum(wz));
Update(wz,);
}
while(R>q[i].r)
{
wz=lower_bound(sz+,sz+tot+,color[R])-sz;
ans-=(Sum(N)-Sum(wz));
Update(wz,-);
R--;
}
ans1[q[i].id]=ans;
}
for(i=;i<=Q;i++)printf("%d\n",ans1[i]);
return ;
}

Bzoj 3289: Mato的文件管理 莫队,树状数组,逆序对,离散化,分块的更多相关文章

  1. bzoj 3289: Mato的文件管理 莫队+树状数组

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description Mato同学 ...

  2. bzoj 3289 : Mato的文件管理 (莫队+树状数组)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3289 思路: 求区间最小交换的次数将区间变成一个不降序列其实就是求区间逆序对的数量,这 ...

  3. BZOJ3289[JZYZOJP2018]: Mato的文件管理 莫队+树状数组+离散化

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

  4. bzoj3289 Mato的文件管理 莫队+树状数组

    求逆序对个数,莫队套树状数组 #include<cstdio> #include<iostream> #include<cstring> #include<c ...

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

    题目大意:给定一个长度为 N 的序列,M 个询问,每次询问区间逆序对的个数. 题解:用树状数组加速答案转移. 代码如下 #include <bits/stdc++.h> #define f ...

  6. BZOJ 3289: Mato的文件管理[莫队算法 树状数组]

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 2399  Solved: 988[Submit][Status][Di ...

  7. BZOJ 3289: Mato的文件管理 莫队+BIT

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

  8. BZOJ 3236 AHOI 2013 作业 莫队+树状数组

    BZOJ 3236 AHOI 2013 作业 内存限制:512 MiB 时间限制:10000 ms 标准输入输出     题目类型:传统 评测方式:文本比较 题目大意: 此时己是凌晨两点,刚刚做了Co ...

  9. bzoj 3289: Mato的文件管理 莫队+线段树

    题目链接 给一些询问,每个询问给出区间[L, R] , 求这段区间的逆序数. 先分块排序, 然后对于每次更改, 如果是更改L, 那么应该查询区间内比他小的数的个数, 如果更改R, 查区间内比他大的数的 ...

随机推荐

  1. IOS 学习笔记 2015-04-15 Xcode 工程模板分类

    一 Application类型    我们大部分呢的开发工作都是使用Application类型的模板创建IOS程序开始的,该类型包括5个模板1 Master-Detail-Application    ...

  2. MongoDB笔记(五)深入学习

    系列一:http://www.cnblogs.com/huangxincheng/category/355399.html系列二:http://www.cnblogs.com/lipan/catego ...

  3. jQuery 快速入门教程

    内容目录 jQuery 入门 什么是jQuery 如何使用jQuery jQuery的运行原理 如何选择jQuery版本 ready() 准备就绪时执行代码 jQuery 核心:选取元素 使用jQue ...

  4. .net source code

    .NET 类库的强大让我们很轻松的解决常见问题,作为一个好专研的程序员,为了更上一层楼,研究CLR的基础类库实现是快速稳定的捷径. 一般场景下,采用 Reflector可以反射出.NET 的部分实现出 ...

  5. ubuntu16.04添加开机启动任务

    比如要把run-nexus.sh这个脚本制作成开机启动项. 系统工具->首选项->启动应用程序.添加该文件,即可.

  6. Instruments --- 内存泄露

    虽然iOS 5.0版本之后加入了ARC机制,由于相互引用关系比较复杂时,内存泄露还是可能存在.所以了解原理很重要. 这里讲述在没有ARC的情况下,如何使用Instruments来查找程序中的内存泄露, ...

  7. Windows server2008 搭建ASP接口访问连接oracle数据库全过程记录--备用

    真的是太不容易了,以前的时候在window server 2003上面搭建了一套asp+oracle的接口系统,就费了好大的劲儿,其实那会迷迷瞪瞪的也不知道怎么的就弄好了,也懒得管了.OK,从昨天到今 ...

  8. Computer Vision Applied to Super Resolution

    Capel, David, and Andrew Zisserman. "Computer vision applied to super resolution." Signal ...

  9. delphi xe5 android 手机上使用sqlite

    本篇我们介绍一下在android手机上怎样使用sqlite数据库,这里用Navigator实现 增删改查. 1.新建firemonkey mobile application 2.选择blank ap ...

  10. Java ,单实例 多线程 ,web容器,servlet与struts1-2.x系列,线程安全的解决

    1.Servlet是如何处理多个请求同时访问呢? 回答:servlet是默认采用单实例,多线程的方式进行.只要webapp被发布到web容器中的时候,servlet只会在发布的时候实例化一次,serv ...