计蒜客模拟赛D2T2 蒜头君的排序:区间逆序对(移动端点) + 树状数组
题目链接:https://nanti.jisuanke.com/t/16443
题意:
给你一个由1~n构成的正整数序列,有m组询问,每组询问要求输出[l , r]区间内的逆序对个数。
数据范围:
对于100%的数据,满足1 <= n,m <= 30000,l < r,∑ | l[i] - l[i-1] | + ∑ | r[i] - r[i-1] | <= 7 * 10^6。
题解:
如果知道区间[l , r]中的逆序对个数,那么也可以快速求出区间[l-1 , r],[l+1 , r],[l , r-1],[l , r+1]的逆序对个数。
① [l-1 , r]的个数 = [l , r]的个数 + [l , r]中比a[l-1]小的元素的个数
② [l+1 , r]的个数 = [l , r]的个数 - [l+1 , r]中比a[l]小的元素的个数
③ [l , r-1]的个数 = [l , r]的个数 - [l , r-1]中比a[r]大的元素的个数
④ [l , r+1]的个数 = [l , r]的个数 + [l , r]中比a[r+1]大的元素的个数
查询区间内比x大(小)的元素的个数用树状数组实现。
比x大的元素个数 = query(x - 1)
比x小的元素个数 = query(n) - query(x) (区间内元素总个数减去大于等于x的元素个数)
先假定现在的区间为[1 , 1],逆序对总个数为0。对于每一组询问,只要不断移动当前区间的左右端点,并同时更新答案,直至当前区间与询问区间相同即可,输出sum值。
AC Code:
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 30005 using namespace std; int n,m;
int a[MAX_N];
int dat[MAX_N]; void update(int k,int a)
{
while(k<=n)
{
dat[k]+=a;
k+=k&-k;
}
} int query(int k)
{
int sum=;
while(k>)
{
sum+=dat[k];
k-=k&-k;
}
return sum;
} void read()
{
cin>>n;
for(int i=;i<=n;i++)
{
cin>>a[i];
}
} void solve()
{
memset(dat,,sizeof(dat));
cin>>m;
int sum=;
int lef=,rig=;
update(a[],);
for(int i=;i<m;i++)
{
int l,r;
cin>>l>>r;
while(lef<l)
{
update(a[lef],-);
sum-=query(a[lef]-);
lef++;
}
while(lef>l)
{
lef--;
sum+=query(a[lef]-);
update(a[lef],);
}
while(rig<r)
{
rig++;
sum+=query(n)-query(a[rig]);
update(a[rig],);
}
while(rig>r)
{
update(a[rig],-);
sum-=query(n)-query(a[rig]);
rig--;
}
cout<<sum<<endl;
}
} int main()
{
read();
solve();
}
计蒜客模拟赛D2T2 蒜头君的排序:区间逆序对(移动端点) + 树状数组的更多相关文章
- 计蒜客模拟赛D2T3 蒜头君救人:用bfs转移状压dp
题目链接:https://nanti.jisuanke.com/t/16444 题意: 蒜头君是一个乐于助人的好孩子,这天他所在的乡村发生了洪水,有多名村民被困于孤岛上,于是蒜头君决定去背他们离开困境 ...
- 计蒜客模拟赛D1T3 蒜头君的坐骑:用dfs转移dp
题目链接:https://nanti.jisuanke.com/t/16447 题意: 蒜头君有一只坐骑,人马. 一天,蒜头君骑着他的坐骑走上了一片n*m的大荒野,一开始时,蒜头君在(1,1)点,他要 ...
- 计蒜客模拟赛D2T1 蒜头君的兔子:矩阵快速幂
题目链接:https://nanti.jisuanke.com/t/16442 题意: 有个人在第一年送了你一对1岁的兔子.这种兔子刚生下来的时候算0岁,当它在2~10岁的时候,每年都会生下一对兔子, ...
- 计蒜客模拟赛D1T2 蒜头君的树:树上节点之间最短距离和
题目链接:https://nanti.jisuanke.com/t/16446 题意: 给你一棵有n个节点的树以及每条边的长度,输出树上节点之间的最短距离和.然后进行m次操作,每次操作更改一条边的长度 ...
- 计蒜客模拟赛D1T1 蒜头君打地鼠:矩阵旋转+二维前缀和
题目链接:https://nanti.jisuanke.com/t/16445 题意: 给你一个n*n大小的01矩阵,和一个k*k大小的锤子,锤子只能斜着砸,问只砸一次最多能砸到多少个1. 题解: 将 ...
- 计蒜客模拟赛5 D2T1 成绩统计
又到了一年一度的新生入学季了,清华和北大的计算机系同学都参加了同一场开学考试(因为两校兄弟情谊深厚嘛,来一场联考还是很正常的). 不幸的是,正当老师要统计大家的成绩时,世界上的所有计算机全部瘫痪了. ...
- 计蒜客模拟赛5 D2T2 蚂蚁搬家
很久很久以前,有很多蚂蚁部落共同生活在一片祥和的村庄里.但在某一天,村庄里突然出现了一只食蚁兽,蚂蚁们为了保全性命而决定搬家. 然而这个村庄四面环山,想要离开这个村庄必须要从地洞里离开,村子里一共有 ...
- 计蒜客模拟赛 #5 (B 题) 动态点分治+线段树
虽然是裸的换根dp,但是为了在联赛前锻炼码力,强行上了点分树+线段树. 写完+调完总共花了不到 $50$ 分钟,感觉还行. code: #include <bits/stdc++.h> # ...
- 计蒜客D2T2 蒜头君的排序(动态维护树状数组)
蒜头君的排序(sort) 2000ms 262144K 蒜头君是一个爱思考的好孩子,这一天他学习了冒泡排序,于是他就想,把一个乱序排列通过冒泡排序排至升序需要多少次交换,这当然难不倒他,于是他想来点刺 ...
随机推荐
- AutoMapper 6.x 扩展
简介 很多时候我们使用AutoMapper的时候,都需要进行一个配置才可以使用Mapper.Map<Source,Target>(entity);.如果不进行配置则会报错. 如果实体过多, ...
- 实现一个简单的Log框架
实际上算不上框架,只是自己对日志框架的一点理解. 核心接口:Logger,供调用者完成不同等级的日志输出 package com.lichmama.log.service; public interf ...
- ps命令学习笔记
最近在看linux优化大师这本书,第2章祥细讲解了分析系统用的工具,这里把一些内容整理出来,以便加深印像. 当进行系统分析时,ps命令显示有关选择的活跃进程的信息.ps命令提供当前已存在的进程列表,和 ...
- 性能百万/s:腾讯轻量级全局流控方案详解
WeTest 导读 全新的全局流控实现方案,既解决了目前流控的实现难点,同时保证运行稳定且流控准确的前提下,实现更简单,部署成本更低,容灾能力更强. 该方案组件化之后,可以推广到别的有需要的部门使用, ...
- 为何你跟着滴滴D8级前端大神撸代码,技术却依旧原地踏步?
引子 听说最近有很多小伙伴,热衷于在慕课网上学习各种前端实战教程,并以完成项目为奋斗目标.比如本文接下来要提到的<Vue2.0高级实战之开发移动端音乐App>,这门课程的传授者是来自滴滴D ...
- JAVA高并发
一.JAVA高级并发 1.5JDK之后引入高级并发特性,大多数的特性在java.util.concurrent 包中,是专门用于多线程发编程的,充分利用了现代多处理器和多核心系统的功能以编写大规模并发 ...
- Threads(线程)(二)
前一章我们提到了同步异步,多线程:在开始今天的文章之前,先来总结一下上一篇文章的内容,多线程的优点. 多线程有哪些优点呢,在这里通过代码依次来总结. 异步多线程的三大特点 1)同步方法卡界面,原因是主 ...
- Python基础之常用模块(一)
模块本质就是一个.py文件,在安装目录下的lib文件夹下可以看到 模块分为三个部分:内置模块(存在于解释器中),第三方模块(lib文件夹下),自定义模块(自己定义的) 1.time模块 import ...
- Memcached的基础梳理
1 .Memcached 概念 官方解释如下: What is Memcached? Free & open source, high-performance, distributed mem ...
- 安装j2ee开发环境
先安装jdk,再安装eclipse ,再安装myeclipse. eclipse与myeclipse必须在图形化界面安装. 1. 挂载光驱/硬盘 mount /mnt/cdrom/ 挂载光驱 ...