http://www.lydsy.com/JudgeOnline/problem.php?id=3289 (题目链接)

题意

  求区间逆序对

Solution

  离线无修改查询,莫队转移;树状数组维护区间和。

  关键: 
   ①在一列数的后面添加一个数,逆序对数会增加 数列中比它大的数的个数。 
   ②在一列数的后面删除一个数,逆序对数会减少 数列中比它大的数的个数。 
   ③在一列数的前面添加一个数,逆序对数会增加 数列中比它小的数的个数。 
   ④在一列数的前面删除一个数,逆序对数会减少 数列中比它小的数的个数。

  这样一来就做法就很显然了。

代码

// bzoj3289
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<map>
#define inf 2147483640
#define LL long long
#define free(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout);
using namespace std;
inline LL getint() {LL x=0,f=1;char ch=getchar();while (ch>'9' || ch<'0') {if (ch=='-') f=-1;ch=getchar();}while (ch>='0' && ch<='9') {x=x*10+ch-'0';ch=getchar();}return x*f;
}const int maxn=50010;
struct ask {int l,r,id;}t[maxn];
int pos[maxn],a[maxn],b[maxn],c[maxn],ans[maxn],block,n,m,q;int lowbit(int x) {return x&-x;
}
void add(int x,int val) {for (int i=x;i<=m;i+=lowbit(i)) c[i]+=val;
}
int query(int x) {int t=0;for (int i=x;i>=1;i-=lowbit(i)) t+=c[i];return t;
}
bool cmp(ask a,ask b) {return pos[a.l]==pos[b.l] ? a.r<b.r : pos[a.l]<pos[b.l];
}
int main() {scanf("%d",&n);for (int i=1;i<=n;i++) scanf("%d",&a[i]),b[i]=a[i];scanf("%d",&q);for (int i=1;i<=q;i++) scanf("%d%d",&t[i].l,&t[i].r),t[i].id=i;sort(b+1,b+1+n);m=unique(b+1,b+1+n)-b-1;for (int i=1;i<=n;i++) a[i]=lower_bound(b+1,b+1+m,a[i])-b;block=(int)sqrt(n);for (int i=1;i<=n;i++) pos[i]=(i-1)/block+1;sort(t+1,t+1+q,cmp);int res=0;for (int i=1,l=1,r=0;i<=q;i++) {for (;r<t[i].r;r++)res+=r+1-l-query(a[r+1]),add(a[r+1],1);for (;r>t[i].r;r--)res-=r-l-query(a[r]-1),add(a[r],-1);for (;l<t[i].l;l++)res-=query(a[l]-1),add(a[l],-1);for (;l>t[i].l;l--)res+=query(a[l-1]),add(a[l-1],1);ans[t[i].id]=res;}for (int i=1;i<=q;i++) printf("%d\n",ans[i]);return 0;
}

  

转载于:https://www.cnblogs.com/MashiroSky/p/5914536.html

【bzoj3289】 Mato的文件管理相关推荐

  1. bzoj3289 mato的文件管理

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

  2. 莫队——BZOJ3289 Mato的文件管理

    http://www.lydsy.com/JudgeOnline/problem.php?id=3289 是离线的好开心啊 为什么说开心呢,这种题,碰到离线,就可以莫队了呀 求逆序对嘛,来发树状数组 ...

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

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

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

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

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

    Time:2016.09.07 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: 这个题意就是让你求[l,r]的逆序对数 暴力做的话是O(Qn2)O(Qn^2)或O(Qnlogn)O( ...

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

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

  7. Mato的文件管理 (莫队)题解

    思路: 莫队模板题,转换几次就是找逆序数,用树状数组来储存数就行了 注意要离散化 代码: #include<queue> #include<cstring> #include& ...

  8. AC日记——Mato的文件管理 bzoj 3289

    3289 思路: 莫队求区间逆序对个数,树状数组维护: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 500 ...

  9. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

最新文章

  1. pytorch中ModuleNotFoundError: No module named ‘tensorboard‘
  2. linux将字符串转小写_Python教程第10讲:字符串的使用
  3. anconda安装及opencv配置
  4. 关于提高代码复用性的几个知识点的回顾
  5. Socket常用语法与socketserver实例
  6. Spring 知识点提炼-转
  7. TeamViewer——Ubuntu系统上的安装和卸载
  8. Apache2 httpd.conf中文版
  9. MTK:UART串口收发数据
  10. IPFS(DRAFT 3) 中文版白皮书
  11. 深度linux安装dkms,安装Virtualbox 错误提示安装DKMS解决方法
  12. 开始学习开发Chrome扩展插件
  13. 日期转换 例如 二零零六年十二月二十一日 转换成 2006年12月21日
  14. NIST cybersecurity framework的五个核心功能
  15. 讲一点色相、饱和度、明度
  16. 微信小程序picker组件仅点击其中的内容才会触发事件
  17. 网页导航栏的设计原则和注意事项
  18. 如何用Tensorboard工具查看Loss损失率
  19. codecombat 矩形形态攻略
  20. JavaDemo——wav转mp3

热门文章

  1. 指针、数组、函数阶段小结
  2. 【Android】 Intent应用详解
  3. 计算机组成原理简单选择题,计算机组成原理选择题及答案.doc
  4. linux服务器备份软件下载,Linux服务器的常用备份方法 服务器系统备份方法
  5. h5 修改title 微信_微信公众号客服消息不限次数推送如何设置?
  6. redis 秒杀成功 mysql_如何使用Redis实现秒杀
  7. 每天一道LeetCode-----将字符串拆分成有效的ip地址
  8. 2020-09-11
  9. 计算机网络基础昆明理工大学,昆明理工大学 计算机网络基础 实验四
  10. 使用fastcoll进行md5碰撞,两个不同的文件md5值一样。