BZOJ3289【莫队算法+树状数组+离散化】
思路:
区间逆序数即是交换次数。
逆序数,可以用树状数组吧。
怎么处理区间变换的时候求逆序数啊。。
这里分成左边的增/删,右边的增/删
因为是按时序插入,
所以左边增,增一个数,计算:ans+=sun(cur_val-1)[比他小的数的个数]
那么删:删一个数,计算ans+=sun(cur_val-1)[比他小的数的个数]
右边增的话,赠一个数,是ans+=比该值大的数的个数,那也就是ans+=区间-比他小的个数
删除同理。
补:
突然意识到莫队的每次增加区间点都意味着这个点之前所造成的贡献/效果要先删除,
然后更新这个点,
计算这个点更新后造成的贡献/效果。
而这里的话,一个点给出的效果已经知道。
WA在了树状数组算数组元素v[i]前缀和,应该是sum(v[i]-1);
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII; const int N=5e4+10;
int c[N*4],n,q;
int pos[N],v[N];
vector<int>xs;
struct asd
{
int left,right,res,id;
} e[N];
bool cmp(asd x,asd y)
{
if(pos[x.left]==pos[y.left]) return x.right<y.right;
return x.left<y.left;
}
bool cmp_id(asd x,asd y)
{
return x.id<y.id;
} int lowbit(int x)
{
return x&(-x);
}
void add(int x,int val)
{
while(x<N)
{
c[x]+=val;
x+=lowbit(x);
}
} int sum(int i)
{
int ans=0;
while(i)
{
ans+=c[i];
i-=lowbit(i);
}
return ans;
} int ans;
int solve()
{
memset(c,0,sizeof(c));
ans=0;
for(int i=0,L=1,R=0; i<q; i++)
{
while(R<e[i].right)//右增;
{
add(v[R+1],1);
ans+=R+1-L+1-sum(v[R+1]);//区间-比他小的数-他本身的数。
R++;
}
while(R>e[i].right)//右缩
{
ans-=R-L+1-sum(v[R]);//区间-比他小的数-他本身的数。
add(v[R],-1);
R--;
}
while(L<e[i].left)//左缩
{
ans-=sum(v[L]-1);
add(v[L],-1);
L++;
}
while(L>e[i].left)//左扩
{
add(v[L-1],1);
ans+=sum(v[L-1]-1);
L--;
}
e[e[i].id].res=ans;
}
} int main()
{
scanf("%d",&n);
int block=(int)sqrt(n);
for(int i=1; i<=n; i++)
{
scanf("%d",&v[i]);
xs.push_back(v[i]);
pos[i]=(i-1)/block+1;
}
sort(xs.begin(),xs.end());
for(int i=1;i<=n;i++)
v[i]=lower_bound(xs.begin(),xs.end(),v[i])-xs.begin()+1;
scanf("%d",&q);
for(int i=0; i<q; i++)
{
scanf("%d%d",&e[i].left,&e[i].right);
e[i].id=i;
}
sort(e,e+q,cmp);
solve();
for(int i=0; i<q; i++)
printf("%d\n",e[i].res);
return 0;
}
/*
4
1 4 2 3
2
1 2
2 4
5
9 8 5 3 2
1 */
BZOJ3289【莫队算法+树状数组+离散化】的更多相关文章
- HDU-6534-Chika and Friendly Pairs (莫队算法,树状数组,离散化)
链接: https://vjudge.net/contest/308446#problem/C 题意: Chika gives you an integer sequence a1,a2,-,an a ...
- 【bzoj3289】Mato的文件管理 离散化+莫队算法+树状数组
原文地址:http://www.cnblogs.com/GXZlegend/p/6805224.html 题目描述 Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份 ...
- BZOJ3289 Mato的文件管理(莫队算法+树状数组)
题目是区间逆序数查询. 莫队算法..左或右区间向左或右延伸时加或减这个区间小于或大于新数的数的个数,这个个数用树状数组来统计,我用线段树超时了.询问个数和数字个数都记为n,数字范围不确定所以离散化,这 ...
- 【BZOJ3289】Mato的文件管理 莫队算法+树状数组
[BZOJ3289]Mato的文件管理 Description Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号.为了防止他人偷拷,这些资料都是 ...
- HDU 6278 - Just h-index - [莫队算法+树状数组+二分][2018JSCPC江苏省赛C题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6278 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...
- BZOJ 3289: Mato的文件管理[莫队算法 树状数组]
3289: Mato的文件管理 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 2399 Solved: 988[Submit][Status][Di ...
- BZOJ 3289:Mato的文件管理(莫队算法+树状数组)
http://www.lydsy.com/JudgeOnline/problem.php?id=3289 题意:…… 思路:求交换次数即求逆序对数.确定了这个之后,先离散化数组.然后在后面插入元素的话 ...
- 【BZOJ】3289: Mato的文件管理(莫队算法+树状数组)
http://www.lydsy.com/JudgeOnline/problem.php?id=3289 很裸的莫队... 离线了区间然后分块排序后,询问时搞搞就行了. 本题中,如果知道$[l, r] ...
- BZOJ 2120: 数颜色 带修改的莫队算法 树状数组套主席树
https://www.lydsy.com/JudgeOnline/problem.php?id=2120 标题里是两种不同的解法. 带修改的莫队和普通莫队比多了个修改操作,影响不大,但是注意一下细节 ...
随机推荐
- 模式匹配之sift--- sift图像特征提取与匹配算法代码
sift,The Scale Invariant Feature Transform ,尺度不变特征变换,是检测图像中具有唯一性.对图像平移.旋转.缩放.甚至仿射变换(如从不同角度拍摄图片)保持不变性 ...
- 面向对象基础——String类
String类的两种实例化方法 A:直接赋值 public class StringDemo01{ public static void main(String args[]){ String na ...
- Android 向右滑动销毁(finish)Activity, 随着手势的滑动而滑动的效果
http://blog.csdn.net/xiaanming/article/details/20934541
- Interface AutoCloseable
https://docs.oracle.com/javase/tutorial/essential/exceptions/try.html https://docs.oracle.com/javase ...
- Page (computer memory)
A page, memory page, or virtual page is a fixed-length contiguous block of virtual memory, described ...
- Android笔记之文本随滑块移动的SeekBar
效果图 FloatingTextSeekBar.java package com.bu_ish.blog; import android.content.Context; import android ...
- CSU-1531 Jewelry Exhibition —— 二分图匹配(最小覆盖点)
题目链接:https://vjudge.net/problem/CSU-1531 Input Output Sample Input 2 1 5 3 0.2 1.5 0.3 4.8 0.4 3.5 4 ...
- Android工程的目录结构
1.最大限度的将不需要出现在Java代码中的文件和代码本身分离开来 2.使用XML标记语言定义UI和数据结构 3.对于工程中的文件存储在工程目录中的那个位置有着严格的规定,在编译过程中Android会 ...
- Yii的缓存机制之数据缓存
具体说法就是可以缓存变量信息. 设置:Yii::app()->cache->set(名字, 值, 过期时间): 使用:Yii::app()->cache->get(名字); 删 ...
- 001-将Python源码转换为不需要环境的可执行文件
1 安装pyinstaller pip install pyinstaller #或者 pip3 install pyinstaller 2 生成打包文件 在命令行中输入 pyinstaller -F ...