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.
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
5 9 1 0 5 4 3 1 2 3 0
Sample Output
6 0
题意:
每组数据有n个数,以下n行是这n个数的值,通过转换相邻的两个数,让最后的序列是从小到大的。问需要几步,也就是求逆序数对
题解:这一题用到的思想有带权线段树,(线段树,每个节点用来维护一段区间的最大值或总和等。
权值线段树,相当于一个桶,每个节点用来表示一个区间的数出现的次数。它可以快速找到第k大或第k小值,不过是整个区间的,不是子区间的),这道题根据下标建树
数值 1,7,5,2
下标: 1 2 3 4
按照值sort排序后
数值:1 2 5 7
下标:1 4 3 2
然后建带权线段树
还可以参考这里的讲解,看别人讲解的不错,点击这里(注明链接)https://blog.csdn.net/Nothing_but_Fight/article/details/98471932?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-4.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-4.channel_param