hdu 1394 求逆序数

来源:互联网 发布:元首最为人知的cp是谁 编辑:程序博客网 时间:2024/06/07 05:48

原题链接:点击打开链接

题意:这个单词 “inversion number”是逆序数的意思,给出一个序列,将第一个数不断放置于最后一位 ,求在这些序列中 逆序数最小的是多少。

思路 :求逆序数,

code:

#include <iostream>#include <algorithm>#include<stdio.h>#include<string.h>using namespace std;const int MAX=5e4+10;int out[MAX],ps,a[MAX];struct point{    int i;    double l,r;} p[MAX];int lowbit(int x){return x&(-x);}void modify(int pos,int num){    while(pos<=MAX)    {        out[pos]+=num;        pos+=lowbit(pos);    }}int sum(int pos){    int su=0;    while(pos>0)    {        su+=out[pos];        pos-=lowbit(pos);    }    return su;}int main(){   // freopen("i.txt","r",stdin);    int n,i,j;    while(scanf("%d",&n)!=EOF)    {        memset(out,0,sizeof(out));        int ans=0;        for( i=1; i<=n; i++)        {            scanf("%d",&a[i]);            a[i]++;//树状数组不能到0;            modify(a[i],1);            ans+=(i-sum(a[i]));前i个中数中 ,小于等于a[i]的数的个数        }        int tem=ans;        int m=n+1;        for(i=1;i<=n;i++)        {            for(j=i+1;j<m;j++)            {                 if(a[i]>a[j])//跑一遍就知道为什么了                    tem--;                 if(a[i]<a[j])                    tem++;            }            ans=min(ans,tem);            a[m++]=a[i];        }        printf("%d\n",ans);    }    return 0;}


0 0
原创粉丝点击