| Time Limit: 7000MS | Memory Limit: 65536K | |
| Total Submissions: 47014 | Accepted: 17182 |
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 Input
Output
Sample Input
5 9 1 0 5 4 3 1 2 3 0
Sample Output
6 0
Source
题意:求按冒泡升序排序的交换次数。
题解:按顺序依次插入树状数组里,每次统计a[i]前面有多少个数,然后ans+=i-num;
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#define N 5000010
#define ll long long
using namespace std;
int n;
struct node {
int x;
int num;
} a[N];
int bit[N];
bool cmp_1(node a,node b) {
return a.x<b.x;
}
bool cmp_2(node a,node b) {
return a.num<b.num;
}
int sum(int i) {
int s=0;
while(i>0) {
s+=bit[i];
i-=i&-i;
}
return s;
}
void add(int i,int x) {
while(i<=n) {
bit[i]+=x;
i+=i&-i;
}
}
int main() {
//freopen("test.in","r",stdin);
while(cin>>n&&n) {
for(int i=1; i<=n; i++) {
scanf("%d",&a[i].x);
a[i].num=i;
}
sort(a+1,a+n+1,cmp_1);
for(int i=1; i<=n; i++)//离散化
a[i].x=i;
sort(a+1,a+n+1,cmp_2);
memset(bit,0,sizeof bit);
ll ans=0;
for(int i=1; i<=n; i++) {
ans+=i-sum(a[i].x)-1;
add(a[i].x,1);
}
printf("%lld\n",ans);
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
POJ 2299 Ultra-QuickSort(树状数组)
原文地址:http://blog.csdn.net/acm_baihuzi/article/details/46810747