树状数组—求逆序数的个数
2017-08-23 22:18
232 查看
[align=left]Problem Description[/align]
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.
[align=left]Input[/align]
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.
[align=left]Output[/align]
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.
[align=left]Sample Input[/align]
5
9
1
0
5
4
3
1
2
3
0
[align=left]Sample Output[/align]
[align=left]6[/align]
[align=left]0[/align]
[align=left]
[/align]
[align=left]大体的题意:[/align]
[align=left]给你n个数,让你求一求有几个逆序数。[/align]
[align=left]思路:[/align]
[align=left]逆序数,换句话说就是让我求一求数的左边有几个比它大的数字。[/align]
[align=left]在这里我们用到了离散化。[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
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.
[align=left]Input[/align]
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.
[align=left]Output[/align]
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.
[align=left]Sample Input[/align]
5
9
1
0
5
4
3
1
2
3
0
[align=left]Sample Output[/align]
[align=left]6[/align]
[align=left]0[/align]
[align=left]
[/align]
[align=left]大体的题意:[/align]
[align=left]给你n个数,让你求一求有几个逆序数。[/align]
[align=left]思路:[/align]
[align=left]逆序数,换句话说就是让我求一求数的左边有几个比它大的数字。[/align]
[align=left]在这里我们用到了离散化。[/align]
[align=left]
[/align]
#if 0 #include<iostream> #include<algorithm> #include<cstring> #include<stdio.h> #include<cmath> using namespace std; const int MAXN=500000+50; int n; int b[MAXN]; int c[MAXN]; struct node { int v,id; bool operator <(const node & a)const { return v<a.v; } }a[MAXN]; int lowbit(int x) { return x&(-x); } void add(int x,int v) { for( ; x<=MAXN ; x+=lowbit(x)) { c[x]+=v; } } int sum(int x) { int sum=0; for( ; x>0; x-=lowbit(x)) sum+=c[x]; return sum; } int main() { while(cin>>n&&n) { memset(c,0,sizeof(c)); memset(b,0,sizeof(b)); memset(a,0,sizeof(a)); for(int i=1; i<=n; i++) { scanf("%d",&a[i].v); a[i].id=i; } sort(a+1,a+n+1); b[a[1].id]=1; //离散化 for(int i=2; i<=n; i++) { if(a[i].v==a[i-1].v) b[a[i].id]=b[a[i-1].id]; else b[a[i].id]=i; } long long int s=0; for(int i=1; i<=n; i++) { int temp=i-1-sum(b[i]);// int temp=sum(n)-sum(b[i]); add(b[i],1); s+=temp; } cout<<s<<endl; } } #endif
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
相关文章推荐
- poj2299 Ultra-QuickSort(离散化+树状数组求逆序数)
- POJ 3067 Japan(利用树状数组求逆序数)
- 树状数组求逆序数poj2299
- poj2299 Ultra-QuickSort&&NYOJ117 求逆序数 (树状数组求逆序对数+离散化)+(归并排序)
- POJ3067 Japan(树状数组,逆序数)
- 树状数组求逆序数原理
- HLG 1400 汽车比赛 (11年黑龙江省赛)树状数组(逆序数)
- HDU 1394 Minimum Inversion Number(线段树/树状数组求逆序数)
- 树状数组 求逆序数
- UVALive 4329 Ping pong(树状数组求逆序数+顺序数)
- PKU 2299 求解逆序数(使用归并或者树状数组) 树状数组及入门知识
- 【2014 Multi-University Training Contest 5】 Inversion (离散化,树状数组求逆序数)
- HDU2838 Cow Sorting 树状数组 区间求和加逆序数的应用
- POJ 2299 Ultra-QuickSort(树状数组求逆序数)
- HDU 2838 Cow Sorting(树状数组求逆序数)
- Codeforces Round #301 (Div. 2) E . Infinite Inversions 树状数组求逆序数
- 【树状数组】poj2299 Ultra-QuickSort(离散化+树状数组求逆序数)
- hdu1394 Minimum Inversion Number(树状数组求逆序数)
- hdu 2838(树状数组求逆序数)
- 树状数组求逆序数