Time:2016.09.07
Author:xiaoyimi
转载注明出处谢谢


传送门
思路:
这个题意就是让你求[l,r]的逆序对数
暴力做的话是O(Qn2)O(Qn^2)或O(Qnlogn)O(Qnlogn)
考虑莫队做法
那怎么在莫队转移的时候快速计算逆序对数呢?
如果我们当前的区间是[l,r]
转移[l+1,r]—>减去的答案就是[l,r]中比a[l]小的数的个数
转移[l-1,r]—>加上的答案就是[l,r]中比a[l-1]小的数的个数
转移[l,r+1]—>加上的答案就是[l,r]中比a[r+1]大的数的个数
转移[l,r-1]—>减去的答案就是[l,r]中比a[r]大的数的个数
这个东西我们可以用离散化+树状数组来搞啊
这样的话复杂度就是O(nn√logn)O(n\sqrt nlogn)
比较玄学的复杂度
注意离散化后树状数组的区间并不是[1,n]
代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#define low(x) (x&-x)
#define M 50003
using namespace std;
int n,m;
int a[M],b[M],c[M],d[M],block[M];
struct query{int l,r,id;
}q[M];
bool cmp(query a,query b)
{if (block[a.l]==block[b.l]) return a.r<b.r;return block[a.l]<block[b.l];
}
int in()
{int t=0;char ch=getchar();while (ch<'0'||ch>'9') ch=getchar();while (ch>='0'&&ch<='9') t=(t<<1)+(t<<3)+ch-48,ch=getchar();return t;
}
void add(int x,int val)
{for (;x<=b[0];x+=low(x))d[x]+=val;
}
int get(int x)
{int ans=0;for (;x;x-=low(x))ans+=d[x];return ans;
}
main()
{n=in();int t=sqrt(n);for (int i=1;i<=n;++i)a[i]=b[i]=in(),block[i]=i/t+1;sort(b+1,b+n+1);b[0]=unique(b+1,b+n+1)-b-1;for (int i=1;i<=n;++i) a[i]=lower_bound(b+1,b+b[0]+1,a[i])-b;m=in();for (int i=1;i<=m;++i) q[i]=(query){in(),in(),i};sort(q+1,q+m+1,cmp);int L=1,R=0,ans=0;for (int i=1;i<=m;++i){for (int j=R+1;j<=q[i].r;++j)ans+=get(b[0])-get(a[j]),add(a[j],1);for (int j=R;j>q[i].r;--j)ans-=get(b[0])-get(a[j]),add(a[j],-1);for (int j=L;j<q[i].l;++j)ans-=get(a[j]-1),add(a[j],-1);for (int j=L-1;j>=q[i].l;--j)ans+=get(a[j]-1),add(a[j],1);L=q[i].l;R=q[i].r;c[q[i].id]=ans;}for (int i=1;i<=m;++i) printf("%d\n",c[i]);
}

【BZOJ3289】Mato的文件管理,莫队+树状数组相关推荐

  1. BZOJ 3289 Mato的文件管理 | 莫队 树状数组

    BZOJ 3289 Mato的文件管理 题意 求区间逆序对. 题解 在莫队的基础上使用树状数组求逆序对. 在当前区间左侧加入一个数时,res += 原区间比它小的数的个数: 在当前区间右侧加入一个数时 ...

  2. Bzoj 3289: Mato的文件管理 莫队,树状数组,逆序对,离散化,分块

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

  3. BZOJ-3289-Mato的文件管理-莫队+树状数组

    描述 给定一段 n(n≤50000) 个数的序列, m(m≤50000) 次询问 [L, R] 区间内相邻元素两两交换使得序列不降的最少次数. 分析 首先转化为一个逆序对的问题, 最少交换的次数就是逆 ...

  4. HDU多校1 - 6959 zoto(莫队+树状数组/值域分块)

    题目链接:点击查看 题目大意:在二维平面内有 nnn 个点,表示为 (i,f[i])(i,f[i])(i,f[i]),需要回答 mmm 次询问,每次询问会给出一个矩形,问矩形内有多少个不同的 yyy ...

  5. BZOJ3236[Ahoi2013]作业——莫队+树状数组/莫队+分块

    题目描述 输入 输出 样例输入 3 4 1 2 2 1 2 1 3 1 2 1 1 1 3 1 3 2 3 2 3 样例输出 2 2 1 1 3 2 2 1 提示 N=100000,M=1000000 ...

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

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3289 [题目大意] 求静态区间逆序对. [题解] 我们对查询进行莫队操作,对于区间的删 ...

  7. HH的项链 HYSBZ - 1878 (莫队/ 树状数组)

    HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一 段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此他的项链变得越来越长.有一天,他突然 ...

  8. HDU 4417 Super Mario(莫队 + 树状数组 + 离散化)

    Super Mario 思路 区间查找问题,容易想到离线莫队,确实这题就是莫队,接下来我们考虑如何维护区间高度值问题. 既然是离线嘛,我们容易想到离散化和他挂钩,想想这题是否需要离散化,高度的最大值是 ...

  9. Chika and Friendly Pairs(莫队+树状数组+离散化+预处理上下界)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6534 Chika and Friendly Pairs Time Limit: 2000/1000 M ...

最新文章

  1. PyQt5 简易计算器
  2. Python 之 Pandas (二)选择数据
  3. 【小假期】反思与计划。6.9-6.10
  4. python copy函数用法_Python深浅拷贝
  5. Android studio3.5 SDK29项目开发笔记
  6. 用truffle部署智能合约到以太坊网络(truffle+infura)的简易方法
  7. 中兴myos和鸿蒙,继华为鸿蒙系统以后!中兴再次发布新系统MyOS:可媲美苹果
  8. 关于JavaScript闭包理解
  9. 【贪玩巴斯】带你一起攻克英语语法长难句—— 第六章——英语的特殊结构 ——2022年3月19日-20日
  10. 上海私车牌价狂降3万余元!!!
  11. [蓝牙 Mesh Zephyr]-[001]-Mesh beacon
  12. 模型小常识,C4D扫描的使用
  13. 数据模型(LP32 ILP32 LP64 LLP64 ILP64 )
  14. matlab中周期延拓,如何周期延拓函数?
  15. 18 人教小学五年级上册《除数是整数的小数除法》(五上)
  16. 关于程序员的几个小段子
  17. 【爬虫】查看代理IP是否有效
  18. 数据库实验2 创建数据表修改数据表和删除数据表
  19. Oracle APEX 系列文章3:在阿里云上打造属于你自己的APEX完整开发环境 (安装CentOS, Tomcat, Nginx)
  20. 外媒中国量子计算机,比美国快100亿倍,中国量子计算机赢得霸权!外媒致敬

热门文章

  1. 前端工具webpack4.0各个击破——html部分
  2. 硬核评测:企业上云的极速存储挑战,华为云全新极速IO云硬盘性能评测
  3. android 手机 跑分榜,安兔兔跑分最新排行图 2020年4月Android手机性能榜
  4. java中 与%_java中“/”与“%”的区别
  5. Kotlin学习笔记17 反射Part1
  6. Think in Java第四版 读书笔记9第15章 泛型
  7. 三星 6.01 android操作系统耗电,三星6.01系统耗电加快是为什么
  8. react div 事件优先级_React 架构的演变 更新机制
  9. Spark编译报错问题日志记录
  10. day4 终止条件continue和break和return的区别