蒜头君的排序(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. MxNet C++和python环境配置

    MxNet C++和python环境配置 安装文件: 1.为了与python已经安装好的版本一致,在这个网站下载mxnet 1.0.0的源码 https://github.com/apache/inc ...

  2. 轻量级封装DbUtils&Mybatis之三MyBatis分页

    MyBatis假分页 参考DefaultResultSetHandler的skipRows方法. 温馨提示:部分代码请参考轻量级封装DbUtils&Mybatis之一概要 解决方案 1)之前公 ...

  3. MongoDB在windows平台分片集群部署

    本文转载自:https://www.cnblogs.com/hx764208769/p/4260177.html 前言-为什么我要使用mongodb 最近我公司要开发一个日志系统,这个日志系统包括很多 ...

  4. Android多线程断点下载的代码流程解析

    Step 1:创建一个用来记录线程下载信息的表 创建数据库表,于是乎我们创建一个数据库的管理器类,继承SQLiteOpenHelper类 重写onCreate()与onUpgrade()方法 DBOp ...

  5. Java-Runoob-高级教程:Java 序列化

    ylbtech-Java-Runoob-高级教程:Java 序列化 1.返回顶部 1. Java 序列化 Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包 ...

  6. SQL Server、Oracle和MySQL判断NULL的方法

    SQL Server.Oracle和MySQL判断NULL的方法 本文讲述SQL Server.Oracle.MySQL查出值为NULL的替换. 在SQL Server Oracle MySQL当数据 ...

  7. Nginx 之:nginx.conf结构

    nginx.conf文件结构如下: ..... events { ...... } http{ .... server{ .... } server{ listen  192.168.0.12:80; ...

  8. MySQL5.7.18,初始化完成登录,提示密码过

    初始化完成登录,提示密码过期 原因: 安装CentOs的时候,默认安装了mysql,并且版本与自己安装的mysql版本不一致,直接使用mysql -uroot -p'password'连接,默认调用的 ...

  9. MySql入门(1)

    环境变量的重要性环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息.例如Windows和DOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程 ...

  10. http请求头设置

    Curl curl -i -H 'Content-Type: application/json' -i/--include     输出时包括protocol头信息curl -x 10.12.15.1 ...