传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3289

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

题解:莫队+树状数组+逆序对

代码:

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define maxn 100000
using namespace std;
int n,m;
int pos[maxn],val[maxn],c[maxn],bo[maxn],ans[maxn*];
struct data{
int l,r,a,b,id;
}a[maxn*];
int read()
{
int x=; char ch; bool bo=;
while (ch=getchar(),ch<''||ch>'') if (ch=='-') bo=;
while (x=x*+ch-'',ch=getchar(),ch>=''&&ch<='') ;
if (bo) return -x; return x;
}
int lowbit(int x){ return x&-x;
}
void add(int x,int v)
{
for (int i=x; i<=n; i+=lowbit(i)) c[i]+=v;
}
int query(int x)
{
int res=;
for (int i=x; i; i-=lowbit(i)) res+=c[i];
return res;
}
bool cmp(data a,data b)
{
if (pos[a.l]==pos[b.l])
if (pos[a.l]&) return a.r<b.r;
else return a.r>b.r;
return pos[a.l]<pos[b.l];
}
void init()
{
n=read(),m=read();
for (int i=; i<=n; i++) val[i]=read();
for (int i=; i<=m; i++)
{
a[i].l=read(),a[i].r=read(),a[i].a=read(),a[i].b=read(); a[i].id=i;
}
int kk=int (sqrt(n));
for (int i=; i<=n; i++) pos[i]=(i-)/kk+;
sort(a+,a++m,cmp);
}
void updata(int k,int vval)
{
if (vval==-)
{
if (bo[val[k]]==) add(val[k],-);
bo[val[k]]--;
}
else
{
if (!bo[val[k]]) add(val[k],);
bo[val[k]]++;
}
}
void work()
{
int r=,l=;
for (int i=; i<=m; i++)
{
for (; r<a[i].r; r++) updata(r+,);
for (; r>a[i].r; r--) updata(r,-);
for (; l<a[i].l; l++) updata(l,-);
for (; l>a[i].l; l--) updata(l-,);
ans[a[i].id]=query(a[i].b)-query(a[i].a-);
}
for (int i=;i<=m; i++)
printf("%d\n",ans[i]);
}
int main()
{
init();
work();
}

  

bzoj3289的更多相关文章

  1. 【bzoj3289】 Mato的文件管理

    http://www.lydsy.com/JudgeOnline/problem.php?id=3289 (题目链接) 题意 求区间逆序对 Solution 离线无修改查询,莫队转移:树状数组维护区间 ...

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

    这个做法非常显然. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib& ...

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

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

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

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

  5. [bzoj3289]Mato的文件管理_莫队_树状数组

    Mato的文件管理 bzoj-3289 题目大意:给定一个n个数的序列.m次询问:一段区间中的逆序对个数. 注释:$1\le n\,mle 5\cdot 10^4$. 想法: 开始想这个题的大佬们,给 ...

  6. [bzoj3289]Mato的文件管理

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

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

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

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

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

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

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

随机推荐

  1. php简单命令代码集锦

    if(file_exists("file.htm"))// 检查是否存在此文件 if(file_exists("chat"))//检查是否存在此文件夹 rena ...

  2. TCP/IP模型各个层次的功能和协议

      层次名称 功    能 协    议 应用层 (Application Layer) 负责实现一切与应用程序相关的功能,对应OSI参考模型的上三层 FTP(文件传输协议) HTTP(超文本传输协议 ...

  3. Sql语句不等于空

    对于这种有null的我一般用这样的句子 isnull(Tag,'') <> '文章' 这样就可以搞定了不管是字符还是数字都可以用 <>

  4. iis7支持asp(访问页面,页面存在仍然提示404)

    1. win7下安装IIS时ASP一般被默认不选中的状态,因此需要打开IIS检查功能视图栏中是否存在ASP选项,若没有则需要从控制面板->程序和 功能->打开或关闭Windows功能-&g ...

  5. IIS判断W3WP进程对应哪个网站

    IIS 6 (Win2003 )中查看某个应用程序池对应那个 W3WP.exe 进程,可以使用如下命令,输出结果类似如下: C:\WINDOWS\system32>cscript iisapp. ...

  6. 详细版在虚拟机安装和使用hadoop分布式集群

    集群模式: 一台master 192.168.85.2 一台slave  192.168.85.3 jdk jdk1.8.0_74(版本不重要,看喜欢) hadoop版本 2.7.2(版本不重要,2. ...

  7. web学习:Spring2.5+Hibernate3.3+Struts1.3整合小例子

    写android有段时间了,感觉思维越写越狭窄,考虑问题越来越局限了,看不到一个项目整体的设计和构架,觉得很有必要多多写一些大型的框架性的东西来提高自己的视野. 从接触java到现在一年多了,在我的印 ...

  8. Android--paint应用举例

    android 用paint,canvas 绘图 (1)主要用了paint ,canvas 两个类中的方法 (2)主要用了画线和画圆的方法. (3)drawline(起始点轴坐标,起始点y轴坐标,终点 ...

  9. Qt5:Qt中图片的翻转,旋转,缩放,扭曲操作

    具体用到了  mirror()  shear()  scaled() translate() rotate() 等函数函数等会儿再写 (其中  translate() 和 rotate() 俩函数组合 ...

  10. ubuntu安装mysql数据库

    http://www.cnblogs.com/zhuyp1015/p/3561470.html http://www.2cto.com/database/201401/273423.html http ...