bzoj 3289 : Mato的文件管理 (莫队+树状数组)
题目链接:
https://www.lydsy.com/JudgeOnline/problem.php?id=3289
思路:
求区间最小交换的次数将区间变成一个不降序列其实就是求区间逆序对的数量,这道题的样例解释可以不看,样例应该是
4和2换再和3换,这样就是最小的交换次数变成不降序列,从样例我们可以看出其实这就是求逆序对的过程,但是这道题是
区间询问逆序对的个数,我们需要离线处理所有询问,然后用树状数组维护数组中比这个数小的数的数量,用莫队逐个维护
就好了,
我们可以推出删除,增加一个数对当前区间逆序对数量变化的关系:
1. 在序列的前端添加一个数,那么序列逆序对的数量就会增加序列中比这个数小的数的数量
2.在序列的前端删除一个数,那么序列中逆序对的数量就会减少序列中比这个数小的数的数量
3.在序列的末端添加一个数,那么序列中逆序对的数量就会增加序列中比这个数大的数的数量
4.在序列的末端删除一个数,那么序列中逆序对的数量就会增加序列中比这个数大的数的数量
这里树状数组的作用就是维护序列中比某个数大/小的数的数量
实现代码;
#include<bits/stdc++.h>
using namespace std;
const int M = 1e5+;
int blo,n,m,a[M],b[M],c[M<<],num[M];
int lowbit(int x){ return x&(-x);} int getsum(int x){
int sum = ;
while(x>){
sum += c[x];
x -= lowbit(x);
}
return sum;
} void update(int x,int val){
while(x <= n){
c[x] += val;
x += lowbit(x);
}
} struct node{
int l,r,id;
}q[M]; bool cmp(node a,node b){
if(a.l/blo == b.l/blo) return a.r < b.r;
return a.l < b.l;
} int main()
{
scanf("%d",&n);
blo = sqrt(n);
for(int i = ;i <= n;i ++){
scanf("%d",&a[i]);
b[i] = a[i];
}
sort(b+,b+n+);
for(int i = ;i <= n;i ++)
a[i] = lower_bound(b+,b++n,a[i])-b;
scanf("%d",&m);
for(int i = ;i <= m;i ++){
scanf("%d%d",&q[i].l,&q[i].r);
q[i].id = i;
}
sort(q+,q++m,cmp);
int l = ,r = ,ans = ;
for(int i = ;i <= m;i ++){
while(l < q[i].l) update(a[l],-),ans -= getsum(a[l]-),l++;
while(r < q[i].r) r++,ans += getsum(n)-getsum(a[r]),update(a[r],);
while(l > q[i].l) l--,ans += getsum(a[l]-),update(a[l],);
while(r > q[i].r) update(a[r],-),ans -= getsum(n) - getsum(a[r]),r--;
num[q[i].id] = ans;
}
for(int i = ;i <= m;i ++)
printf("%d\n",num[i]);
return ;
}
bzoj 3289 : Mato的文件管理 (莫队+树状数组)的更多相关文章
- bzoj 3289: Mato的文件管理 莫队+树状数组
3289: Mato的文件管理 Time Limit: 40 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description Mato同学 ...
- Bzoj 3289: Mato的文件管理 莫队,树状数组,逆序对,离散化,分块
3289: Mato的文件管理 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 1539 Solved: 665[Submit][Status][Di ...
- BZOJ3289[JZYZOJP2018]: Mato的文件管理 莫队+树状数组+离散化
描述 Description Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号.为了防止他人偷拷,这些资料都是加密过的, ...
- bzoj3289 Mato的文件管理 莫队+树状数组
求逆序对个数,莫队套树状数组 #include<cstdio> #include<iostream> #include<cstring> #include<c ...
- 【BZOJ3289】Mato的文件管理 莫队+树状数组
题目大意:给定一个长度为 N 的序列,M 个询问,每次询问区间逆序对的个数. 题解:用树状数组加速答案转移. 代码如下 #include <bits/stdc++.h> #define f ...
- BZOJ 3289: Mato的文件管理[莫队算法 树状数组]
3289: Mato的文件管理 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 2399 Solved: 988[Submit][Status][Di ...
- BZOJ 3289: Mato的文件管理 莫队+BIT
3289: Mato的文件管理 Description Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号.为了防止他人偷拷,这些资料都是加密过的 ...
- BZOJ 3236 AHOI 2013 作业 莫队+树状数组
BZOJ 3236 AHOI 2013 作业 内存限制:512 MiB 时间限制:10000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目大意: 此时己是凌晨两点,刚刚做了Co ...
- bzoj 3289: Mato的文件管理 莫队+线段树
题目链接 给一些询问,每个询问给出区间[L, R] , 求这段区间的逆序数. 先分块排序, 然后对于每次更改, 如果是更改L, 那么应该查询区间内比他小的数的个数, 如果更改R, 查区间内比他大的数的 ...
随机推荐
- SkylineGlobe的PopupMessage里面嵌入的网页如何与主页面交互通讯
1.主页面调用PopupMessage,如果需要传值,就是普通的页面间的传值就可以实现了. a.html页面调用PopupMessage创建方法,url传入b.html?x=111&y=22; ...
- C#中用HttpWebRequest中发送GET/HTTP/HTTPS请求 (转载)
这个需求来自于我最近练手的一个项目,在项目中我需要将一些自己发表的和收藏整理的网文集中到一个地方存放,如果全部采用手工操作工作量大而且繁琐,因此周公决定利用C#来实现.在很多地方都需要验证用户身份才可 ...
- BZOJ1178 APIO2009 会议中心 贪心、倍增
传送门 只有第一问就比较水了 每一次贪心地选择当前可以选择的所有线段中右端点最短的,排序之后扫一遍即可. 考虑第二问.按照编号从小到大考虑每一条线段是否能够被加入.假设当前选了一个区间集合\(T\), ...
- Codechef STREDUC Reduce string Trie、bitset、区间DP
VJ传送门 简化题意:给出一个长度为\(l\)的模板串\(s\)与若干匹配串\(p_i\),每一次你可以选择\(s\)中的一个出现在集合\(\{p_i\}\)中的子串将其消去,其左右分成的两个串拼接在 ...
- 一文详解如何用 TensorFlow 实现基于 LSTM 的文本分类(附源码)
雷锋网按:本文作者陆池,原文载于作者个人博客,雷锋网已获授权. 引言 学习一段时间的tensor flow之后,想找个项目试试手,然后想起了之前在看Theano教程中的一个文本分类的实例,这个星期就用 ...
- 《Head First 设计模式》例子的C++实现(1 策略模式)
最近在学习设计模式,用的是 <Head First 设计模式>这本书.感觉这本书写的还是很不错的,深入浅出的介绍了各种常用的设计模式.唯一有点不方便的地方是这本书的例子全都是用的 Java ...
- Libgdx学习记录28——创建Desktop程序
1.新建Java Project. 2.添加libs,添加相关的jar文件. 3. 在Project Build Path中,添加Reference. 4. 添加文件夹assets,并右键Build ...
- pycharm2019注册码一键实时获取,永久有效!
pycharm2019专业版激活码 56ZS5PQ1RF-eyJsaWNlbnNlSWQiOiI1NlpTNVBRMVJGIiwibGljZW5zZWVOYW1lIjoi5q2j54mI5o6I5p2 ...
- 浅谈nornalize.css(含源码)
Normalize.css是一种CSS reset的替代方案.经过@necolas和@jon_neal花了几百个小时来努力研究不同浏览器的默认样式的差异,这个项目终于变成了现在这样. 我们创造norm ...
- 熟记这些git命令,你就是大神
1.git log 查看 提交历史 默认不用任何参数的话,git log 会按提交时间列出所有的更新,最近的更新排在最上面 2.git log -p -2 常用 -p 选项展开显示每次提交的内容差异 ...