标签:
| Time Limit: 7000MS | Memory Limit: 65536K | |
| Total Submissions: 44390 | Accepted: 16149 |
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
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
#define N 1000000
int n,reflect[N],c[N];
long long ans;
struct node
{
int val;
int pos;
}a[N];
bool cmp(node a,node b)
{
return a.val<b.val;
}
int lowbit(int x)
{
return x&(-x);
}
int sum(int x)
{
int sum=0;
while(x>0)
{
sum+=c[x];
x=x-lowbit(x);
}
return sum;
}
void add(int pos,int x)
{
while(pos<N)
{
c[pos]+=x;
pos+=lowbit(pos);
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
memset(reflect,0,sizeof(reflect));
memset(c,0,sizeof(c));
ans=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i].val);
a[i].pos=i;
}
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++)
reflect[a[i].pos]=i;
for(int i=1;i<=n;i++)
{
add(reflect[i],1);
ans+=i-sum(reflect[i]);
}
printf("%I64d\n",ans);
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/a972290869/p/4255524.html