POJ2299 Ultra-QuickSort(树状数组)

来源:互联网 发布:尤克里里调音器软件 编辑:程序博客网 时间:2024/06/05 19:42

题目链接

题目大意:给出一个序列,只能交换相邻的两个数字,是的交换完成时变成一个升序序列,求最小的交换次数。

求逆序数,给出的数据过大,要离散化

代码如下:

#include <stdio.h>#include <iostream>#include <string.h>#include <algorithm>using namespace std;const int N=500005;int tree[N];struct node{    int val;    int id;}in[N];bool cmp(node a,node b){    return a.val<b.val;}int lowbit(int i){    return i&(-i);}void add(int i,int x){    while(i<=N)    {        tree[i]+=x;        i+=lowbit(i);    }}int query(int i){    int cnt=0;    while(i>0)    {        cnt+=tree[i];        i-=lowbit(i);    }    return cnt;}int main(){   int n;   int data[N];   while(scanf("%d",&n)!=EOF&&n)   {       for(int i=1;i<=n;i++)//离散化       {           scanf("%d",&in[i].val);           in[i].id=i;       }       sort(in+1,in+n+1,cmp);       for(int i=1;i<=n;i++)           data[in[i].id]=i;       memset(tree,0,sizeof(tree));       long long int ans=0;       for(int i=1;i<=n;i++)       {           ans+=i-query(data[i])-1;           add(data[i],1);       }       printf("%lld\n",ans);   }   return 0;}

还有一种离散化的方式能去使相同的元素离散化后的值是一样的

#include <stdio.h>#include <iostream>#include <string.h>#include <algorithm>using namespace std;const int N=500005;int tree[N];struct node{    int val;    int id;}in[N];bool cmp(node a,node b){    return a.val<b.val;}int lowbit(int i){    return i&(-i);}void add(int i,int x){    while(i<=N)    {        tree[i]+=x;        i+=lowbit(i);    }}int query(int i){    int cnt=0;    while(i>0)    {        cnt+=tree[i];        i-=lowbit(i);    }    return cnt;}int main(){   int n;   int data[N];   while(scanf("%d",&n)!=EOF&&n)   {       for(int i=1;i<=n;i++)//离散化       {           scanf("%d",&in[i].val);           in[i].id=i;       }       sort(in+1,in+n+1,cmp);       int p=1;       data[in[1].id]=p;       for(int i=2;i<=n;i++)       {           if(in[i].val!=in[i-1].val)                p++;           data[in[i].id]=p;       }       for(int i=1;i<=n;i++)          printf("%d ",data[i]);       printf("\n");       memset(tree,0,sizeof(tree));       long long int ans=0;       for(int i=1;i<=n;i++)       {           ans+=i-query(data[i])-1;           add(data[i],1);       }       printf("%lld\n",ans);   }   return 0;}




原创粉丝点击