Time Limit: 7000MS | Memory Limit: 65536K | |
Total Submissions: 71503 | Accepted: 26877 |
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
5
9
1
0
5
4
3
1
2
3
0
Sample Output
6
0
Source
思路:求交换次数实际上就是求逆序对的个数,树状数组离散化后求解。ans开long long。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n;long long ans; int num[500010],tree[500010]; struct nond{ int a,pos; }v[500010]; int lowbit(int t){ return t&(-t); } int cmp(nond x,nond y){ return x.a<y.a; } void change(int x,int opt){ for(int i=x;i<=n;i+=lowbit(i)) tree[i]+=opt; } int sum(int x){ int bns=0; for(int i=x;i>0;i-=lowbit(i)) bns+=tree[i]; return bns; } int main(){ while(cin>>n&&n!=0){ for(int i=1;i<=n;i++){ scanf("%d",&v[i].a); v[i].pos=i; } sort(v+1,v+1+n,cmp); for(int i=1;i<=n;i++) num[v[i].pos]=i; for(int i=1;i<=n;i++){ change(num[i],1); ans+=(i-sum(num[i])); } cout<<ans<<endl;ans=0; memset(tree,0,sizeof(tree)); } }