poj2299--B - Ultra-QuickSort(线段树,离散化)
来源:互联网 发布:哥特萝莉安妮淘宝 编辑:程序博客网 时间:2024/05/29 15:55
Ultra-QuickSort
Time Limit: 7000MS Memory Limit: 65536KTotal Submissions: 41215 Accepted: 14915
Description
In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by swapping two adjacent sequence elements until the sequence is sorted in ascending order. For the input sequence
9 1 0 5 4 ,
Ultra-QuickSort produces the output
0 1 4 5 9 .
Your task is to determine how many swap operations Ultra-QuickSort needs to perform in order to sort a given input sequence.
Ultra-QuickSort produces the output
Your task is to determine how many swap operations Ultra-QuickSort needs to perform in order to sort a given input sequence.
Input
The input contains several test cases. Every test case begins with a line that contains a single integer n < 500,000 -- the length of the input sequence. Each of the the following n lines contains a single integer 0 ≤ a[i] ≤ 999,999,999, the i-th input sequence element. Input is terminated by a sequence of length n = 0. This sequence must not be processed.
Output
For every input sequence, your program prints a single line containing an integer number op, the minimum number of swap operations necessary to sort the given input sequence.
Sample Input
59105431230
Sample Output
60
题意:求出最小交换次数,使得数组变得有序(由小到大)。 也就是求出逆序数,这个题归并排序,树状数组,线段树又可以解,可以当做练手用
使用线段树解的话,因为给出的数值很大,所以需要离散化,一开始直接使用map果断的超时了,只能想一个更简便的离散的方法,使用结构体存下一开始的值k和它初始的序号(id1),sort对k进行排序,得到新的序号(id2),通过id1直接改变给出的数组,变为id2,这样只用n + logn的时间就可以离散完成,(注意要判断重复的值,重复的值共享一个id2)。至于线段树部分就是一个模板
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define LL __int64#define maxn 600000#define lmin 1#define rmax n#define lson l,(l+r)/2,rt<<1#define rson (l+r)/2+1,r,rt<<1|1#define root lmin,rmax,1#define now l,r,rt#define int_now LL l,LL r,LL rtstruct node{ LL id1 , id2 ; LL k ;}p[maxn] ;LL cl[maxn<<2] , a[maxn] ;bool cmp(node a,node b){ return a.k < b.k ;}void push_up(int_now){ cl[rt] = cl[rt<<1] + cl[rt<<1|1] ;}void update(LL i,int_now){ if( i < l || i > r ) return ; if( i == l && i==r ) { cl[rt]++ ; return ; } update(i,lson); update(i,rson); push_up(now); return ;}LL query(int ll,int rr,int_now){ if( ll > r || rr < l ) return 0; if( ll <= l && r <= rr ) return cl[rt] ; return query(ll,rr,lson) + query(ll,rr,rson);}int main(){ LL i , n , m , l , r , x , num ; while(scanf("%I64d", &m) && m) { for(i = 0 ; i < m ; i++) { scanf("%I64d", &a[i]); p[i].k = a[i] ; p[i].id1 = i ; } sort(p,p+m,cmp); int temp = -1 ; n = 0 ; for(i = 0 ; i < m ; i++) { if( p[i].k == temp ) p[i].id2 = n ; else { p[i].id2 = ++n ; temp = p[i].k ; } } for(i = 0 ; i < m ; i++) a[ p[i].id1 ] = p[i].id2 ; memset(cl,0,sizeof(cl)); num = 0 ; for(i = 0 ; i < m ; i++) { num += (i - query(1,a[i],root)); update(a[i],root); } printf("%I64d\n", num); } return 0;}
0 0
- poj2299--B - Ultra-QuickSort(线段树,离散化)
- POJ2299 Ultra-QuickSort(线段树)
- poj2299:Ultra-QuickSort(树状数组+离散化)
- poj2299 Ultra-QuickSort (树状数组+离散化)
- POJ2299 Ultra-QuickSort 树状数组+离散化
- poj2299 Ultra-QuickSort 树状数组 + 离散化
- POJ2299-Ultra-QuickSort(树状数组+离散化)
- poj2299 Ultra-QuickSort(线段树计数问题)
- POJ 2299 Ultra-QuickSort(线段树+离散化)
- (POJ2299)Ultra-QuickSort
- poj2299 Ultra-QuickSort(归并排序 || 离散化+树状数组)
- poj2299 Ultra-QuickSort(树状数组求逆序数,离散化)
- poj2299 Ultra-QuickSort(离散化+树状数组求逆序数)
- 【树状数组--求逆序数(离散化)】poj2299 Ultra-QuickSort
- poj2299(线段树+离散化)
- 【POJ】2299 - Ultra-QuickSort(离散化 & (树状数组 | 线段树))
- poj 2299 Ultra-QuickSort(线段树,离散化求逆序数)
- POJ 2299 Ultra-QuickSort (树状数组求逆序数 || 线段树 +离散化)
- Android短信管理
- 经典DP问题
- 离线版MSDN下载地址
- hdu-2187悼念512汶川大地震遇难同胞——老人是真饿了(贪心)
- Java中无法引用没有包、默认包、顶级类
- poj2299--B - Ultra-QuickSort(线段树,离散化)
- 设计模式概述【整理】
- 在centos6中同时使用python2和python3
- gedit下汇编不高亮显示的解决办法
- STL 之 stack
- Libevent源码分析-----配置event_base
- ZOJ2588 Burning Bridges 割边
- Number Sequence(杭电1005)
- hdu 1800 Flying to the Mars(贪心)