<题目链接>

题目大意:

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

解题分析:

不难发现,其实本题就是让我们求原始序列的逆序对,这里我们用树状数组求解。正常求解逆序数的方法无非就是按照原始序列的顺序向树状数组中加入每个元素的值,然后查询该树状数组在这个值前面已经由几个比新加入的值要小的,用当前遍历到的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

POJ 2299 Ultra-QuickSort (离散化)+【树状数组】的更多相关文章

  1. POJ 2299 Ultra-QuickSort 逆序数 树状数组 归并排序 线段树

    题目链接:http://poj.org/problem?id=2299 求逆序数的经典题,求逆序数可用树状数组,归并排序,线段树求解,本文给出树状数组,归并排序,线段树的解法. 归并排序: #incl ...

  2. poj 2299 Ultra-QuickSort(归并排序,树状数组,线段树)

    Description In this problem, you have to analyze a particular sorting algorithm. The algorithm proce ...

  3. CodeForces 540E - Infinite Inversions(离散化+树状数组)

    花了近5个小时,改的乱七八糟,终于A了. 一个无限数列,1,2,3,4,...,n....,给n个数对<i,j>把数列的i,j两个元素做交换.求交换后数列的逆序对数. 很容易想到离散化+树 ...

  4. Ultra-QuickSort(归并排序+离散化树状数组)

    Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 50517   Accepted: 18534 ...

  5. HDU 5862 Counting Intersections(离散化+树状数组)

    HDU 5862 Counting Intersections(离散化+树状数组) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 D ...

  6. BZOJ_4627_[BeiJing2016]回转寿司_离散化+树状数组

    BZOJ_4627_[BeiJing2016]回转寿司_离散化+树状数组 Description 酷爱日料的小Z经常光顾学校东门外的回转寿司店.在这里,一盘盘寿司通过传送带依次呈现在小Z眼前.不同的寿 ...

  7. poj-----Ultra-QuickSort(离散化+树状数组)

    Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 38258   Accepted: 13784 ...

  8. Code Forces 652D Nested Segments(离散化+树状数组)

     Nested Segments time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  9. hdu 3015 Disharmony Trees (离散化+树状数组)

    Disharmony Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  10. 【bzoj4627】[BeiJing2016]回转寿司 离散化+树状数组

    题目描述 给出一个长度为n的序列,求所有元素的和在[L,R]范围内的连续子序列的个数. 输入 第一行包含三个整数N,L和R,分别表示寿司盘数,满意度的下限和上限. 第二行包含N个整数Ai,表示小Z对寿 ...

随机推荐

  1. IntelliJ IDEA使用教程 (总目录篇)

    注:本文来源于<    IntelliJ IDEA使用教程 (总目录篇)  > IntelliJ IDEA使用教程 (总目录篇) 硬件要求 IntelliJ IDEA 的硬件要求 安装包云 ...

  2. Confluence 6 升级自定义的站点和空间关闭缓存

    Velocity 被配置在内存中使用缓存模板.当你在 Confluence 中编辑了页面的模板文件,Confluence 知道文件进行了编辑,将会重新从磁盘中载入模板文件.如果你直接在 Conflue ...

  3. Android UiAutomator - CTS Frame

    使用UiAutomator进行UI自动化测试后,生成的测试结果并不是很美观.为了生成一份好看的测试结果(报告),本文将使用CTS框架,当然也可以自己编写一份测试报告框架(如:生成html,excel报 ...

  4. Vue+restfulframework示例

    一.简单回顾vue 前不久我们已经了解了vue前端框架,所以现在强调几点: 修改源: npm config set registry https://registry.npm.taobao.org 创 ...

  5. BeatifulSoup模块

    一.介绍 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你 ...

  6. Python编程:从入门到实践(选记)

    本文参考< Python 编程:从入门到实践>一书,作者: [ 美 ] Eric Matthes 第1章 起步 1.1     搭建python环境 在不同的操作系统中, Python 存 ...

  7. LeetCode(113):路径总和 II

    Medium! 题目描述: 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径. 说明: 叶子节点是指没有子节点的节点. 示例:给定如下二叉树,以及目标和 sum = ...

  8. cf1114D 区间dp基础

    最简单的那类区间dp,昨天晚上心态不对,不知道在打什么.. /* dp[l][r]表示区间[l,r]都涂成同色的代价 dp[l][r]可以由dp[l][r-1],dp[l+1][r],dp[l+1][ ...

  9. Python元组与列表的区别

    列表类似于我们用铅笔在纸上写字,写错了还可以擦掉:而元组则类似于用钢笔写字,写错了就擦不掉了,除非换张纸重写. 列表和元组的区别主要体现在一下几个方面: 列表属于可变序列,他的元素可以随时修改或删除: ...

  10. 关于C++ const 的全面总结 (转)

    C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助. Const 是C++中常用的类型修饰符,常类型是指使用类 ...