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 ...