【POJ2299】Ultra-Quicksort-逆序对

来源:互联网 发布:软件测试必备工具 编辑:程序博客网 时间:2024/06/06 14:12

题目:Ultra-Quicksort

题目大意:给一个数列,要求将其中的数进行升序排列,只能交换两个相邻的数,问最少的移动次数是多少。

做法:经过观察发现,题目要求的就是数列的逆序对的个数,发现这一点后题目就很简单了。

以下是本人代码(树状数组):

#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int q[500010]={0},n;long long ans,c[500010]={0};struct N{  long val,pos;}node[500010]={0};bool cmp(N a,N b){  return a.val<b.val;}int lowbit(int i){  return i&(-i);}int sum(int x){  int s=0;  for(int i=x;i>0;i-=lowbit(i))    s+=c[i];  return s;}void add(int x){  for(int i=x;i<=n;i+=lowbit(i))    c[i]++;}int main(){  scanf("%d",&n);  while(n!=0)  {    memset(c,0,sizeof(c));ans=0;    for(int i=1;i<=n;i++){  scanf("%ld",&node[i].val);  node[i].pos=i;}sort(node+1,node+n+1,cmp);for(int i=1;i<=n;i++)    q[node[i].pos]=i;for(int i=1;i<=n;i++){  add(q[i]);  ans+=i-sum(q[i]);}printf("%lld\n",ans);scanf("%d",&n);  }    return 0;}


0 0
原创粉丝点击