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 标题里是两种不同的解法. 带修改的莫队和普通莫队比多了个修改操作,影响不大,但是注意一下细节 ...
随机推荐
- 九度OJ 1094:String Matching(字符串匹配) (计数)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1259 解决:686 题目描述: Finding all occurrences of a pattern in a text is a p ...
- Java Virtual Machine (JVM) objects 虚拟机实例的产生 退出 两种线程
Apache Spark is built around a distributed collection of immutable Java Virtual Machine (JVM) object ...
- openstack之路:KVM/Libvirt 安装
openstac是一个开源的计算机平台,利用虚拟化和底层存储服务提供云计算服务.openstack的基本是虚拟化技术.虚拟化技术采用的KVM.我们首先进行KVM软件的安装. 电脑配置: 内存:8G 硬 ...
- Machine Learning in Action(2) 决策树算法
决策树也是有监督机器学习方法. 电影<无耻混蛋>里有一幕游戏,在德军小酒馆里有几个人在玩20问题游戏,游戏规则是一个设迷者在纸牌中抽出一个目标(可以是人,也可以是物),而猜谜者可以提问题, ...
- Android Studio 模拟器无法打开 emulator: ERROR: x86 emulation currently requires hardware
首先要打开SDK的下载位置,找到以下陌路: android-sdk\extras\intel\Hardware_Accelerated_Execution_Manager\IntelHaxm.exe ...
- 基于sys文件系统的LED驱动的移植【原创】
基于RK3188平台LED驱动程序的移植的移植.如有不正确之处,欢迎大家指点. 本文的LED驱动程序不是通过打开设备节点来访问和控制LED的,是通过sys文件系统来控制LED. 板子上有四盏灯以及对应 ...
- win8系统在安装软件时安装framework3.5失败的解决办法
win8系统在,许多软件都需求安装framework3.5,但是很多用户都是安装失败,联网失败,据网上的许多人说有用cmd输入命令,然后到100%,就会成功安装framework3.5(如这个方法:w ...
- js程序开发-3
<h1>Date()类型</h1> 获取日期和时间 getDate() 获取日 1-31 getDay () 获取星期 0-6 getMonth () 获取月 0-11 get ...
- LR-虚拟用户以进程和线程模式运行的区别
进程方式和线程方式的优缺点: 如果选择按照进程方式运行, 每个用户都将启动一个mmdrv进程,多个mmdrv进程会占用大量内存及其他系统资源,这就限制了可以在任一负载生成器上运行的并发用户数的数量,因 ...
- 动态注册BroadcastReceiver
1. [代码][Java]代码 package com.zjt.innerreceiver; import android.app.Service; import android.con ...