【bzoj3289】 Mato的文件管理
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的文件管理相关推荐
- bzoj3289 mato的文件管理
3289: Mato的文件管理 Time Limit: 40 Sec Memory Limit: 128 MB Submit: 3007 Solved: 1272 [Submit][Status] ...
- 莫队——BZOJ3289 Mato的文件管理
http://www.lydsy.com/JudgeOnline/problem.php?id=3289 是离线的好开心啊 为什么说开心呢,这种题,碰到离线,就可以莫队了呀 求逆序对嘛,来发树状数组 ...
- BZOJ 3289 Mato的文件管理 | 莫队 树状数组
BZOJ 3289 Mato的文件管理 题意 求区间逆序对. 题解 在莫队的基础上使用树状数组求逆序对. 在当前区间左侧加入一个数时,res += 原区间比它小的数的个数: 在当前区间右侧加入一个数时 ...
- Bzoj 3289: Mato的文件管理 莫队,树状数组,逆序对,离散化,分块
3289: Mato的文件管理 Time Limit: 40 Sec Memory Limit: 128 MB Submit: 1539 Solved: 665 [Submit][Status][ ...
- 【BZOJ3289】Mato的文件管理,莫队+树状数组
Time:2016.09.07 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: 这个题意就是让你求[l,r]的逆序对数 暴力做的话是O(Qn2)O(Qn^2)或O(Qnlogn)O( ...
- BZOJ 3289 Mato的文件管理(莫队+树状数组)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3289 [题目大意] 求静态区间逆序对. [题解] 我们对查询进行莫队操作,对于区间的删 ...
- Mato的文件管理 (莫队)题解
思路: 莫队模板题,转换几次就是找逆序数,用树状数组来储存数就行了 注意要离散化 代码: #include<queue> #include<cstring> #include& ...
- AC日记——Mato的文件管理 bzoj 3289
3289 思路: 莫队求区间逆序对个数,树状数组维护: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 500 ...
- Noip前的大抱佛脚----赛前任务
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...
最新文章
- pytorch中ModuleNotFoundError: No module named ‘tensorboard‘
- linux将字符串转小写_Python教程第10讲:字符串的使用
- anconda安装及opencv配置
- 关于提高代码复用性的几个知识点的回顾
- Socket常用语法与socketserver实例
- Spring 知识点提炼-转
- TeamViewer——Ubuntu系统上的安装和卸载
- Apache2 httpd.conf中文版
- MTK:UART串口收发数据
- IPFS(DRAFT 3) 中文版白皮书
- 深度linux安装dkms,安装Virtualbox 错误提示安装DKMS解决方法
- 开始学习开发Chrome扩展插件
- 日期转换 例如 二零零六年十二月二十一日 转换成 2006年12月21日
- NIST cybersecurity framework的五个核心功能
- 讲一点色相、饱和度、明度
- 微信小程序picker组件仅点击其中的内容才会触发事件
- 网页导航栏的设计原则和注意事项
- 如何用Tensorboard工具查看Loss损失率
- codecombat 矩形形态攻略
- JavaDemo——wav转mp3
热门文章
- 指针、数组、函数阶段小结
- 【Android】 Intent应用详解
- 计算机组成原理简单选择题,计算机组成原理选择题及答案.doc
- linux服务器备份软件下载,Linux服务器的常用备份方法 服务器系统备份方法
- h5 修改title 微信_微信公众号客服消息不限次数推送如何设置?
- redis 秒杀成功 mysql_如何使用Redis实现秒杀
- 每天一道LeetCode-----将字符串拆分成有效的ip地址
- 2020-09-11
- 计算机网络基础昆明理工大学,昆明理工大学 计算机网络基础 实验四
- 使用fastcoll进行md5碰撞,两个不同的文件md5值一样。