蒜头君的排序(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 蒜头君的排序(动态维护树状数组)的更多相关文章

  1. 计蒜客 - A1633.蒜头君的数轴

    我感觉出的很好的一道题,首先不难想到(其实我刚开始没想到),加点的个数就是找已有点两两形成区间的gcd,那么问题就出在了复杂度上,每次循环哪个区间不要复杂度过高,所以运用正反两次前缀和(?好像不能这么 ...

  2. 牛客多校第3场 J 思维+树状数组+二分

    牛客多校第3场 J 思维+树状数组+二分 传送门:https://ac.nowcoder.com/acm/contest/883/J 题意: 给你q个询问,和一个队列容量f 询问有两种操作: 0.访问 ...

  3. 牛客网 牛客练习赛4 A.Laptop-二维偏序+离散化+树状数组

    A.Laptop 链接:https://ac.nowcoder.com/acm/contest/16/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其 ...

  4. 牛客练习赛47 E DongDong数颜色 (树状数组维护区间元素种类数)

    链接:https://ac.nowcoder.com/acm/contest/904/E 来源:牛客网 DongDong数颜色 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 5242 ...

  5. 「BZOJ1669」D 饥饿的牛 [Usaco2006 Oct] Hungry Cows 牛客假日团队赛5 (LIS,离散化树状数组)

    链接:https://ac.nowcoder.com/acm/contest/984/D 来源:牛客网 饥饿的牛 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言 ...

  6. 计蒜客模拟赛D2T2 蒜头君的排序:区间逆序对(移动端点) + 树状数组

    题目链接:https://nanti.jisuanke.com/t/16443 题意: 给你一个由1~n构成的正整数序列,有m组询问,每组询问要求输出[l , r]区间内的逆序对个数. 数据范围: 对 ...

  7. 计蒜客 28437.Big brother said the calculation-线段树+二分-当前第k个位置的数 ( ACM训练联盟周赛 M)

    M. Big brother said the calculation 通过线段树维护. 这个题和杭电的一道题几乎就是一样的题目.HDU5649.DZY Loves Sorting 题意就是一个n的排 ...

  8. 计蒜客模拟赛 #5 (B 题) 动态点分治+线段树

    虽然是裸的换根dp,但是为了在联赛前锻炼码力,强行上了点分树+线段树. 写完+调完总共花了不到 $50$ 分钟,感觉还行. code: #include <bits/stdc++.h> # ...

  9. 牛客训练六:海啸(二维树状数组+vector函数的使用)

    题目链接:传送门 思路: 二维树状数组, vector(first,last)函数中assign函数相当于将first中的函数清空,然后将last中的值赋值给first. 参考文章:传送门 #incl ...

随机推荐

  1. VMware下安装的Mac OS X如何修改显示分辨率 (转)

    我在Win7下利用VMware安装了苹果的OS x 10.8系统,安装成功启动后,发现分辨率为1024*768,而宿机的分辨率是1440*900,我想让虚拟机全屏显示,也就是想在雪豹下屏幕的分辨率也能 ...

  2. python 笔记2016

    列表,元组(不可添加和修改),字典 3种集合模式 模块----类---函数 要把文件变成双击运行,要把文件的属性选择python安装目录下的python.exe 1,查看数据类型 print(type ...

  3. java结构

    package com.hanqi;// 包名,必须在第一行,和namespace类似 //import java.io.*;//引用,和using类似 //import java.lang.*;// ...

  4. Macbook Pro上安装Windows 7虚机

    折腾了大半天,终于搞定. 首先是安装VirtualBox,之后关键的是需要Win7虚机种子,百度了下去系统之家下的. 如果不是Ghost系统的话,VirtualBox可以直接load安装. 但是那边都 ...

  5. Linux下压缩与解压

    转自:http://www.mike.org.cn/blog/index.php?load=read&id=218###pp=0 [在解压或压缩的时候,一般还使用-v选项来现实正在处理的文件信 ...

  6. PHP中实现函数重载

    转载自:http://cnn237111.blog.51cto.com/2359144/1284085 由于PHP是弱类型语言,因此函数的输入参数类型无法确定(可以使用类型暗示,但是类型暗示无法用在诸 ...

  7. 检测SqlServer服务器性能

    通过性能监视器监视 Avg. Disk Queue Length   小于2 Avg. Disk sec/Read , Avg. Disk sec/Write  小于10ms 可以用数据收集器定时收集 ...

  8. Python web框架 Tornado(三)自定义session组件

    我们在学习Django框架的过程中,内部封装了session组件,以方便于我们使用进行验证.但是Tornado框架是没有session的,所以如果想使用session的话,就需要我们自己定制相对应的组 ...

  9. React组件间信息传递方式

    组件之间传递信息方式,总体可分为以下5种: 1.(父组件)向(子组件)传递信息 2.(父组件)向更深层的(子组件) 进行传递信息  >>利用(context) 3.(子组件)向(父组件)传 ...

  10. 机器学习,数据挖掘,统计学,云计算,众包(crowdsourcing),人工智能,降维(Dimension reduction)

    机器学习 Machine Learning:提供数据分析的能力,机器学习是大数据时代必不可少的核心技术,道理很简单:收集.存储.传输.管理大数据的目的,是为了“利用”大数据,而如果没有机器学习技术分析 ...