POJ 2299 Ultra-QuickSort (离散化)+【树状数组】
<题目链接>
题目大意:
给你一段序列,问你如果每次只交换该序列相邻的两个元素,最少需要交换多少步才能够使该序列变为升序排列。
解题分析:
不难发现,其实本题就是让我们求原始序列的逆序对,这里我们用树状数组求解。正常求解逆序数的方法无非就是按照原始序列的顺序向树状数组中加入每个元素的值,然后查询该树状数组在这个值前面已经由几个比新加入的值要小的,用当前遍历到的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 (离散化)+【树状数组】的更多相关文章
- POJ 2299 Ultra-QuickSort 逆序数 树状数组 归并排序 线段树
题目链接:http://poj.org/problem?id=2299 求逆序数的经典题,求逆序数可用树状数组,归并排序,线段树求解,本文给出树状数组,归并排序,线段树的解法. 归并排序: #incl ...
- poj 2299 Ultra-QuickSort(归并排序,树状数组,线段树)
Description In this problem, you have to analyze a particular sorting algorithm. The algorithm proce ...
- CodeForces 540E - Infinite Inversions(离散化+树状数组)
花了近5个小时,改的乱七八糟,终于A了. 一个无限数列,1,2,3,4,...,n....,给n个数对<i,j>把数列的i,j两个元素做交换.求交换后数列的逆序对数. 很容易想到离散化+树 ...
- Ultra-QuickSort(归并排序+离散化树状数组)
Ultra-QuickSort Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 50517 Accepted: 18534 ...
- HDU 5862 Counting Intersections(离散化+树状数组)
HDU 5862 Counting Intersections(离散化+树状数组) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 D ...
- BZOJ_4627_[BeiJing2016]回转寿司_离散化+树状数组
BZOJ_4627_[BeiJing2016]回转寿司_离散化+树状数组 Description 酷爱日料的小Z经常光顾学校东门外的回转寿司店.在这里,一盘盘寿司通过传送带依次呈现在小Z眼前.不同的寿 ...
- poj-----Ultra-QuickSort(离散化+树状数组)
Ultra-QuickSort Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 38258 Accepted: 13784 ...
- Code Forces 652D Nested Segments(离散化+树状数组)
Nested Segments time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- hdu 3015 Disharmony Trees (离散化+树状数组)
Disharmony Trees Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 【bzoj4627】[BeiJing2016]回转寿司 离散化+树状数组
题目描述 给出一个长度为n的序列,求所有元素的和在[L,R]范围内的连续子序列的个数. 输入 第一行包含三个整数N,L和R,分别表示寿司盘数,满意度的下限和上限. 第二行包含N个整数Ai,表示小Z对寿 ...
随机推荐
- Confluence 6 重要缓存和监控
重要缓存 下面的建议是基本上的一些配置帮助.在大型数据库中,20-30% 的数据库表大型可能是不需要如此膨胀的.在缓存配置的界面中,检查有效率和使用率的配置来进行必要的修改. 内容对象缓存(Conte ...
- python用unittest+HTMLTestRunner的框架测试并生成测试报告
直接贴代码: import unittestfrom selenium import webdriverfrom time import sleepimport osimport time # 定义打 ...
- 深入分析Zookeeper的实现原理
zookeeper 的由来 分布式系统的很多难题,都是由于缺少协调机制造成的.在分布式协调这块做得比较好的,有 Google 的 Chubby 以及 Apache 的 Zookeeper.Google ...
- 操作dom获取datatable中的某一行的某一列的数据
需求描述:编辑的时候,点击的那一行,进入后台的验证方法,验证通过后,再进入编辑页面,进入的时候需要把本行<tr>数据中的某一列<td>的值传递过去 思路表述:之前我想的是,给列 ...
- 【python】获取http响应
一个相对完整的http请求,输入ip和端口,输出响应码,响应头,响应体,是否超时,以及出错时的错误信息 处理包括: 1.协议处理,如果是443用https,其他用http 2.HTTPError处理, ...
- codeforce 240E 最小树形图+路径记录更新
最小树形图的路径是在不断建立新图的过程中更新的,因此需要开一个结构体cancle记录那些被更新的边,保存可能会被取消的边和边在旧图中的id 在朱刘算法最后添加了一个从后往前遍历新建边的循环,这可以理解 ...
- pycharm提示This inspection detects any methods which may safely be made static.
示例代码: class Car(object): # 未定义任何类属性 def move(self): # 方法会出现下划线提示This inspection detects any methods ...
- ajax请求数据时什么时候用GET,什么时候用POST
GET的目的就如同其名字一样是用于获取信息的.它旨在显示出页面上你要阅读的信息.浏览器会缓冲GET请求的执行结果,如果同样的GET请求再次发出,浏览器就会显示缓冲的结果而不是重新运行整个请求.重新请求 ...
- Google C++ 代码规范
Google C++ Style Guide Table of Contents Header Files Self-contained Headers The #define Guard For ...
- IDEA 出现错误:找不到或无法加载主类
idea本身缓存问题 解决:清理缓存重启IDEAfile-->invalidate Cache/restart 之后再重新build. 还不行的话,设置一下file-->project s ...