HDU1394 求逆序數

2021-07-05 08:40:50 字數 1087 閱讀 8823

hdu1394minimum inversion number

逆序數:a[i]後面比它小的數的個數即為a[i]的逆序數,題目要求的是序列的逆序數,求和即可

題意:乙個由0..n-1組成的序列,每次可以把隊首的元素移到隊尾,求形成的n個序列中最小逆序數

思路:乙個序列的逆序數可以用線段樹,或者暴力法求得,然後遞推得到改變位置的序列的逆序數

線段樹:(31ms)

#include

struct nodetree[5001*4];

int p;

void build(int l,int r,int cur)

void update(int cur)

int mid=(tree[cur].left+tree[cur].right)/2;

if(p<=mid)update(cur*2);

else update(cur*2+1);

tree[cur].sum=tree[cur*2].sum+tree[cur*2+1].sum;

}int query(int l,int r,int cur)

int main()

int ans=sum;

for(int i=0;i//求改變位置後的序列的逆序數

sum+=n-2*a[i]-1;

/*因為序列為[0,n-1],若最前面乙個數為x,序列中比x小的

數為[0,x-1],共x個,比x大的數為[x+1,n-1],共n-x-1個,

將x移到最後,比x小的數的逆序數均減1(所以減去了x個1),

x的前面比x大的數有n-x-1個(注意x放到最後了),x的逆序數

增加n-x-1。所以新序列的逆序數為原序列的逆序數加上n-2*x-1*/

if(sum

sum;

}printf("%d\n",ans);

}return

0;}

暴力法:(300ms)

#include

int main()

printf("%d\n",ans);

}return

0;}

hdu 1394 求逆序數

首先建立空樹,將 a i 逐個插入 計算乙個序列n排列的最小逆序數 首先用線段樹算出出事序列的逆序數,然後找規律推出排列的最小逆序數。include include include include include include include include include include inc...

hdu 1394 線段樹求逆序數

線段樹求逆序數 求小逆序數 神奇 題意 給定乙個序列,對該序列的n種排列 排列如下 的每種排列 0 n 1 的逆序數求最小值 a1,a2,an 1,an a2,a3,an,a1 a3,a4,an,a1,a2 an,a1,a2,an 1 思路 先求出初始序列的逆序數,可以歸併,這裡用的是線段數求。設當...

hdu 1394 樹狀陣列求逆序數

解題思路 這道題是求迴圈陣列中逆序數最小值,求逆序數這裡肯定是用樹狀陣列。只是這裡有一點點變化,由於題目中n位數是0 n 1的乙個排列,所以num i 可表示為比num i 小的數的個數。把第一位的數挪到最後一位,那麼整個序列的逆序數變化為ans ans num 0 n 1 num 0 num 0 ...