【BZOJ3289】Mato的文件管理,莫队+树状数组
来源:互联网 发布:淘宝营销活动图片 编辑:程序博客网 时间:2024/05/19 00:52
Time:2016.09.07
Author:xiaoyimi
转载注明出处谢谢
传送门
思路:
这个题意就是让你求[l,r]的逆序对数
暴力做的话是
考虑莫队做法
那怎么在莫队转移的时候快速计算逆序对数呢?
如果我们当前的区间是[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]大的数的个数
这个东西我们可以用离散化+树状数组来搞啊
这样的话复杂度就是比较玄学的复杂度
注意离散化后树状数组的区间并不是[1,n]
代码:
#include<cstdio>#include<iostream>#include<algorithm>#include<cmath> #define low(x) (x&-x)#define M 50003using 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]);}
0 0
- [BZOJ3289]Mato的文件管理(莫队+树状数组)
- 【BZOJ3289】Mato的文件管理,莫队+树状数组
- 莫队+树状数组 题解【bzoj3289】Mato的文件管理
- bzoj3289 Mato的文件管理 莫队+树状数组
- [bzoj3289]Mato的文件管理 莫队+树状数组
- BZOJ3289 Mato的文件管理 【莫队 + 树状数组】
- bzoj3289 Mato的文件管理 莫队算法 树状数组
- 【BZOJ3289】Mato的文件管理(莫队算法+树状数组)
- bzoj3289 Mato的文件管理(树状数组求逆序对+莫队+离散化)
- BZOJ3289: Mato的文件管理 莫队
- bzoj3289: Mato的文件管理
- bzoj3289 : Mato的文件管理
- Bzoj3289: Mato的文件管理
- [bzoj3289]Mato的文件管理
- bzoj3289 Mato的文件管理
- 【BZOJ3289】 Mato的文件管理
- 【bzoj3289】 Mato的文件管理
- bzoj3289 Mato的文件管理
- 378. [LeetCode]Kth Smallest Element in a Sorted Matrix
- c++怎么求一个带空格字符串长度
- 机器学习的前世今生:一段波澜壮阔的历史
- mysql 主从复制配置
- 最大间隙问题。给定 n 个实数,求这n个实数在数轴上相邻2个数之间的最大差值,设计解最大间隙问题的线性时间算法。
- 【BZOJ3289】Mato的文件管理,莫队+树状数组
- aoj 6 Hero In Maze
- Angular学习3
- 安卓开发 市场需求技能
- 变态跳台阶
- mac下安装mysql 5.7.13
- tomcat web.xml 配置详解
- 魔鬼数学读书笔记
- CodeForces 282BPainting Eggs