Mato的文件管理 bzoj-3289

题目大意:给定一个n个数的序列。m次询问:一段区间中的逆序对个数。

注释:$1\le n\,mle 5\cdot 10^4$。


想法

开始想这个题的大佬们,给您点儿提示吧:$O(nlogn\sqrt(n))$可过哦!

所以这个题就是莫队的裸题了。

我们的莫队上的区间在动的时候随时更新树状数组上的信息即可。、

然后碰见了一整块区间,我们就直接求逆序对即可,

最后,附上丑陋的代码... ...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define N 50010
using namespace std;
struct Query {int l,r,id;}q[N]; int L[N],R[N],maxval,tree1[N<<1],tree2[N<<1],blg[N],a[N],ans[N];
inline bool cmp_dispose(const Query &x,const Query &y) {return blg[x.l]==blg[y.l]?x.r<y.r:blg[x.l]<blg[y.l];}
inline char nc() {static char *p1,*p2,buf[100000]; return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;}
int rd() {int x=0; char c=nc(); while(!isdigit(c)) c=nc(); while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=nc(); return x;}
inline int lowbit(int x) {return x&(-x);}
void update1(int x,int val) {for(int i=x;i>=1;i-=lowbit(i)) tree1[i]+=val;}
void update2(int x,int val) {for(int i=x;i<=maxval;i+=lowbit(i)) tree2[i]+=val;}
inline void update(int x,int val) {update1(x,val); update2(x,val);}
int query1(int x) {int ans=0; for(int i=x;i<=maxval;i+=lowbit(i)) ans+=tree1[i]; return ans;}
int query2(int x) {int ans=0; for(int i=x;i>=1;i-=lowbit(i)) ans+=tree2[i]; return ans;}
int main()
{
int n=rd(); int t=sqrt(n); int blck=n/t;
for(int i=1;i<=blck;i++)
{
int bfr=(i-1)*t;
L[i]=bfr+1; R[i]=bfr+t;
for(int j=1;j<=t;j++)
{
blg[bfr+j]=i;
a[bfr+j]=rd();
maxval=max(maxval,a[bfr+j]);
}
}
if(blck*t<n)
{
L[blck+1]=blck*t; R[blck+1]=n; blck++;
for(int j=blck*t+1;j<=n;j++)
{
blg[j]=blck; a[j]=rd(); maxval=max(maxval,a[j]);
}
}
int m=rd();
for(int i=1;i<=m;i++) q[i].l=rd(),q[i].r=rd(),q[i].id=i;
sort(q+1,q+m+1,cmp_dispose);
int point_l=q[1].l,point_r=q[1].r; for(int i=point_l;i<=point_r;i++)
{
ans[q[1].id]+=query1(a[i]+1); update(a[i],1);
}
for(int i=2;i<=m;i++)
{
int idx=q[i].id;
while(point_l<q[i].l)
{
update(a[point_l],-1);
ans[idx]-=query2(a[point_l]-1);
point_l++;
}
while(point_l>q[i].l)
{
point_l--;
update(a[point_l],1);
ans[idx]+=query2(a[point_l]-1);
}
while(point_r<q[i].r)
{
point_r++;
update(a[point_r],1);
ans[idx]+=query1(a[point_r]+1);
}
while(point_r>q[i].r)
{
update(a[point_r],-1);
ans[idx]-=query1(a[point_r]+1);
point_r--;
}
}
for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
return 0;
}

小结:莫队真的强..

[bzoj3289]Mato的文件管理_莫队_树状数组的更多相关文章

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

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

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

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

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

    http://www.lydsy.com/JudgeOnline/problem.php?id=3289 很裸的莫队... 离线了区间然后分块排序后,询问时搞搞就行了. 本题中,如果知道$[l, r] ...

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

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

  5. HDU6534 Chika and Friendly Pairs(莫队,树状数组)

    HDU6534 Chika and Friendly Pairs 莫队,树状数组的简单题 #include<bits/stdc++.h> using namespace std; cons ...

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

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

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

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

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

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

  9. BZOJ3289【莫队算法+树状数组+离散化】

    思路: 区间逆序数即是交换次数. 逆序数,可以用树状数组吧. 怎么处理区间变换的时候求逆序数啊.. 这里分成左边的增/删,右边的增/删 因为是按时序插入, 所以左边增,增一个数,计算:ans+=sun ...

  10. HDU 6278 - Just h-index - [莫队算法+树状数组+二分][2018JSCPC江苏省赛C题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6278 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...

随机推荐

  1. loadrunner11 安装破解,汉化包

    说说自己的心痛史,好不容易安装了loadrunner 11 居然浏览器不支持,我的系统是win8.1,ie浏览器最低支持ie11,我还能说啥子...其他浏览器试过了依旧是不可以!!所以我安装了一个虚拟 ...

  2. 洛谷 P1037 产生数

    题目描述 给出一个整数n(n<10^30)和k个变换规则(k≤15). 规则: 一位数可变换成另一个一位数: 规则的右部不能为零. 例如:n=234.有规则(k=2): 2->53-> ...

  3. [ZJOI2006]GameZ游戏排名系统

    Description GameZ为他们最新推出的游戏开通了一个网站.世界各地的玩家都可以将自己的游戏得分上传到网站上.这样就可以看到自己在世界上的排名.得分越高,排名就越靠前.当两个玩家的名次相同时 ...

  4. vscode使用教程(web开发)

    1.安装 进入官网下载https://code.visualstudio.com/ 一直下一步就好了,中间可以选择把软件安装在哪个目录. 2.常用插件安装 a. 进入扩展视图界面安装/卸载 a1.快捷 ...

  5. Java运行报错问题——Picked up JAVA_TOOL_OPTIONS: -agentlib:jvmhook

    http://blog.csdn.net/xifeijian/article/details/8830933 上述这个朋友博文提醒,可能是因为其他软件添加了JAVA_HOME的路径造成冲突.但他支持删 ...

  6. 我的DBDA类

    <?php class DBDA { public $host="localhost"; public $uid="root"; public $pwd= ...

  7. JNDI链接SQLServer数据库步骤

    1.配置context.xml文件 在我们的WebRoot目录下,就是和WEB-INF同级的目录下,新建一个META-INF的目录(假如不存在),在该目录下创建一个context.xml文件,并且在c ...

  8. Codeforces_768_D_(概率dp)

    D. Jon and Orbs time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  9. 外观模式(Facade)-子系统的协作与整合-接口模式

    对子系统进行整合,对外提供更强大或更便捷的接口. 在一个模块和几个子系统进行通信时考虑. 什么是外观模式? 外观模式(Facade),为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口 ...

  10. Vue实战之插件 sweetalert 的使用

    安装npm install sweetalert2@7.15.1 --save 封装 sweetalertimport swal from 'sweetalert2' export default { ...