<题目链接>

题目大意:

给你一段序列,问你如果每次只交换该序列相邻的两个元素,最少需要交换多少步才能够使该序列变为升序排列。

解题分析:

不难发现,其实本题就是让我们求原始序列的逆序对,这里我们用树状数组求解。正常求解逆序数的方法无非就是按照原始序列的顺序向树状数组中加入每个元素的值,然后查询该树状数组在这个值前面已经由几个比新加入的值要小的,用当前遍历到的i值,减去查询得到i前比node[i].val小的数的个数,即可求得第i的数的逆序数,但是由于本题a[i]非常大,达到了999999999,并且n只有5e5,显然用a[i]的值建立树状数组是不行的,所以这里需要先将输入序列离散化一下,相当于给原始序列的每个元素重新分配一下值(让这些元素值的相对大小不变,但是这些值所分布的区间更加紧凑)。然后按照原始序列进行简单的更新查询操作即可。 这个博客对树状数组讲解的很清晰 >>>

 #include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; typedef long long ll;
const int M =5e5+;
int tr[M],ord[M],n;
struct NODE{
int loc,val;
bool operator < (const NODE &tmp){
return val<tmp.val;
}
}node[M];
int lowbit(int x){return x&(-x);} //得到最低位的1
void add(int i,int val){ //将该点上方的所有tr[]数组的值全部更改一下
while(i<=n){
tr[i]+=val;
i+=lowbit(i);
}
}
int sum(int i){ //得到前i项之和,利用二进制加上树状数组指定序号tr[i]的值求解
ll ans=;
while(i>=){
ans+=tr[i];
i-=lowbit(i);
}
return ans;
}
int main(){
while(scanf("%d",&n)!=EOF,n){
for(int i=;i<=n;i++){
scanf("%d",&node[i].val);
node[i].loc=i;
}
memset(tr,,sizeof(tr));
sort(node+,node++n);
for(int i=;i<=n;i++)ord[node[i].loc]=i; //离散化,相当于给原始的序列重新编号(相对大小不变,但是每个数的值更加紧凑)
ll ans=;
for(int i=;i<=n;i++){
add(ord[i],);
ans+=(i-sum(ord[i])); //现在遍历到第i个数,减去小于等于这个数的个数,就是这个数前面大于这个数的个数,即第i个数的逆序数
}
printf("%lld\n",ans);
}
return ;
}

2018-10-14

最新文章

  1. centos 系统下安装FastDFS+nginx+fastdfs-nginx-module安装配置
  2. C#的New关键字的几种用法
  3. recyleView使用笔记
  4. Facebook开源动画库 POP-小实例
  5. poj2240 floyd
  6. [转载] 深入 nginx 架构
  7. (Delphi) Windows 32 API程序设计目录
  8. codeforces 629D 树状数组+LIS
  9. Js参数RSA加密传输,jsencrypt.js的使用
  10. vi &amp; vim 基本指令(持续更新ing)
  11. LibSvm介绍---调用方法及参数介绍
  12. discuz二次开发笔记(二)------跳转函数运用
  13. Xlint以及Java Lint 选项
  14. Java常用类之【八种基本数据类型】
  15. Python调用外部程序——os.system()和subprocess.call
  16. 解压文件出错解决方法(invalid compressed data--format violated)
  17. Linguistic Data Consortium (LDC)
  18. 【bzoj4712】洪水 动态dp
  19. python3 使用opencv 画基本图形
  20. RabbitMQ 资料整理

热门文章

  1. 不能够连接到主机(名称为localhost)上的MySQL服务”
  2. nginx官方模块之http_sub_status_module
  3. SpringBoot集成Shiro
  4. js之DOM对象三
  5. LeetCode(124):二叉树中的最大路径和
  6. 【python】多进程共享变量
  7. 浏览器URL中 encodeURIComponent()加密和decodeURIComponent()解码
  8. vue 在.vue文件里监听路由
  9. GnuPGP介绍
  10. hexo+github page +markdown问题汇总