计蒜客D2T2 蒜头君的排序(动态维护树状数组)
蒜头君的排序(sort)
2000ms 262144K
蒜头君是一个爱思考的好孩子,这一天他学习了冒泡排序,于是他就想,把一个乱序排列通过冒泡排序排至升序需要多少次交换,这当然难不倒他,于是他想来点刺激的,给定一个1…n1的排列,每次从该排列中选择一个区间[l,r],问使用冒泡排序将该区间排至升序需要多少次交换操作。
输入格式
第一行一个整数n,表示排列长度。
接下来一行n个整数,表示该排列。
接下来一行一个整数m,表示询问次数。
接下来m 行,每行2个整数l,r,表示询问[l,r] 区间。
输出格式
输出m行,每行1个整数,第i行表示第i个询问的答案。
数据规模
对于30%的数据,满足1≤n,m≤300;
对于60%的数据,满足1≤n,m≤1000;
对于100%的数据,满足1≤n,m≤30000,l<r,l<r,∑∣l[i]−l[i−1]|+∑∣r[i]−r[i−1]∣≤ 7*10^6。
样例输入
样例输入
10
9 8 7 4 5 6 10 3 2 1
5
2 4
8 10
2 8
5 9
4 9
样例输出
3
3
13
7
9
解析:这道题直接暴力(直接用冒泡排序或归并排序记录逆序对)可以拿60分;
离线使用树状数组维护能得70分;
在线维护树状数组可以拿100分。。。(为什么离线会超时。。)
关于树状数组的维护我们可以先定义两个指针分别指向左端点和右端点,每次查询时不断的维护这段区间(左端点,右端点不断的向左向右移),即可查询到所有的答案(好神奇。。)
十分不解为什么不能先按照左端点的位置排序,后维护,这样可以少进行一个左端点向左的步骤。。可惜会超时;
关于如何从[l,r]变成[l-1,r],[l+1,r],[l,r-1],[l,r+1],自己手动模拟一遍就知道了,第一次感觉好玄学。。。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#define lo(x) (x&(-x))
#define ll long long
#define man 30010
using namespace std;
//common
int n,m,c[man],pos[man],ask[man];
ll a[man],b[man];
inline int read()
{ int x=;bool f=;
char ch=getchar();
while(ch<''||ch>''){f=(ch==);ch=getchar();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+(ch^);ch=getchar();}
return f?(~x+):x;
}
struct range
{ int x,y,id;}e[man];
//lowbit
inline void add(int x,int val)
{ while(x<=n)
{ c[x]+=val;
x+=lo(x);
}
return ;
}
inline int calc(int x)
{ int ans=;
while(x>)
{ ans+=c[x];
x-=lo(x);
}
return ans;
}
int main()
{ freopen("sort.in","r",stdin);
freopen("sort.out","w",stdout);
n=read();
for(int i=;i<=n;i++)
scanf("%lld",&a[i]),b[i]=a[i];
sort(a+,a++n);
for(int i=;i<=n;i++)
pos[i]=lower_bound(a+,a+n+,b[i])-a;
m=read();
for(int i=;i<=m;i++)
{ e[i].x=read();e[i].y=read();e[i].id=i;}
int l=,r=,ans=;
for(int i=;i<=m;i++)
{ while(r<e[i].y)
{ r++;
ans+=calc(n)-calc(pos[r]-);
add(pos[r],);
}
while(l<e[i].x)
{ add(pos[l],-);
ans-=calc(pos[l]-);
l++;
}
while(r>e[i].y)
{ add(pos[r],-);
ans-=calc(n)-calc(pos[r]-);
r--;}
while(l>e[i].x)
{ l--;
ans+=calc(pos[l]-);
add(pos[l],);
}
ask[e[i].id]=ans;
}
for(int i=;i<=m;i++)
printf("%d\n",ask[i]);
return ;
}
计蒜客D2T2 蒜头君的排序(动态维护树状数组)的更多相关文章
- 计蒜客 - A1633.蒜头君的数轴
我感觉出的很好的一道题,首先不难想到(其实我刚开始没想到),加点的个数就是找已有点两两形成区间的gcd,那么问题就出在了复杂度上,每次循环哪个区间不要复杂度过高,所以运用正反两次前缀和(?好像不能这么 ...
- 牛客多校第3场 J 思维+树状数组+二分
牛客多校第3场 J 思维+树状数组+二分 传送门:https://ac.nowcoder.com/acm/contest/883/J 题意: 给你q个询问,和一个队列容量f 询问有两种操作: 0.访问 ...
- 牛客网 牛客练习赛4 A.Laptop-二维偏序+离散化+树状数组
A.Laptop 链接:https://ac.nowcoder.com/acm/contest/16/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其 ...
- 牛客练习赛47 E DongDong数颜色 (树状数组维护区间元素种类数)
链接:https://ac.nowcoder.com/acm/contest/904/E 来源:牛客网 DongDong数颜色 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 5242 ...
- 「BZOJ1669」D 饥饿的牛 [Usaco2006 Oct] Hungry Cows 牛客假日团队赛5 (LIS,离散化树状数组)
链接:https://ac.nowcoder.com/acm/contest/984/D 来源:牛客网 饥饿的牛 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言 ...
- 计蒜客模拟赛D2T2 蒜头君的排序:区间逆序对(移动端点) + 树状数组
题目链接:https://nanti.jisuanke.com/t/16443 题意: 给你一个由1~n构成的正整数序列,有m组询问,每组询问要求输出[l , r]区间内的逆序对个数. 数据范围: 对 ...
- 计蒜客 28437.Big brother said the calculation-线段树+二分-当前第k个位置的数 ( ACM训练联盟周赛 M)
M. Big brother said the calculation 通过线段树维护. 这个题和杭电的一道题几乎就是一样的题目.HDU5649.DZY Loves Sorting 题意就是一个n的排 ...
- 计蒜客模拟赛 #5 (B 题) 动态点分治+线段树
虽然是裸的换根dp,但是为了在联赛前锻炼码力,强行上了点分树+线段树. 写完+调完总共花了不到 $50$ 分钟,感觉还行. code: #include <bits/stdc++.h> # ...
- 牛客训练六:海啸(二维树状数组+vector函数的使用)
题目链接:传送门 思路: 二维树状数组, vector(first,last)函数中assign函数相当于将first中的函数清空,然后将last中的值赋值给first. 参考文章:传送门 #incl ...
随机推荐
- dateframe行列插入和删除操作
ar = np.array(list("ABCDEFG")) # array只是Convert,默认会copy源值.asarray也是Convert,如果源值是array则不cop ...
- Cmake编译opencv下载不了ffmpeg时的解决办法
- 20165226 2017-2018-2《Java程序设计》课程总结
目录 一.作业汇总 二.总结 三.问卷调查 一.作业汇总 预备作业1:我期望的师生关系 预备作业2:学习基础和C语言基础调查 预备作业3:linux安装及学习 第一周: Java入门 第一周学习总结 ...
- Java 判断某一天是这一年的第几天
package Day8_06; import java.util.*; public class ClassTest { public static void main(String[] args) ...
- Git操作行
基础层:-----------------#初始化一个版本仓库git init #复制远程版本库git clone url #添加远程版本库origingit remote add origin ur ...
- localhost不能访问127.0.0.1可以访问的原因及解决方法 被打磨的不像人样
localhost不能访问127.0.0.1可以访问的原因及解决方法 作者:admin 时间:2013-12-16 10:58:47 浏览:16599 有时候我们在调试程序的时候,会出 ...
- 028:基于mysqldump备份脚本
MySQL Backup and Recovery 一 MySQL Backup 1.功能 mysqldump全量和增量备份,通过最近一次备份刷新产生binlog来定位执行增量. 脚本下载地址 git ...
- 第八章 Health Check
8.1 默认的健康检查 每个容器启动时会执行一个进程,此进程由Dockerfile的CMD或ENTRYPOINT指定.如果进程退出时返回码非零,则认为容器发生故障,K8s就会根据restartPoli ...
- CDH5.10 添加kafka服务
简介: CDH的parcel包中是没有kafka的,kafka被剥离了出来,需要从新下载parcel包安装.或者在线安装,但是在线安装都很慢,这里使用下载parcel包离线安装的方式. PS:kafk ...
- css ! important 兼容性的一点测试
css ! important 这个东西网上一堆内容,我只说我用到的一点地方和我的理解, 这个东西ie6不支持,ie高版本是支持的.其他浏览器也是支持.先理解这一点 .abc { width:100p ...