HAOI2009 逆序對數列

2022-08-19 22:18:10 字數 738 閱讀 7633

求乙個序列的逆序對數很自然的想到了樹狀陣列,方便又快捷。

根據題目的意思,它所說的各種排列是將第乙個元素移至最後形成的排列,那麼我們就從這裡下手,

對於第乙個元素它後面比它小的就一定都會形成逆序對,這樣對於當前的逆序對,

在第乙個元素移至最後時,它的逆序對數就要減少這個元素的值,因為此題數值是連續的所以可以直接減(且從數字大小0開始);

而在移至最後時,大於這個元素的數值的數和它都會形成逆序對。這樣在減了之前的值之後還要加上總的元素的個數t-1-這個元素的值

這樣得到的乙個值就是新排列的逆序對數了。

例:我們要將a[0]移至末尾,總元素的個數是n,當前的逆序對數是sum,那麼將a[0]移至末尾時,sum += n - a[0] - 1 - a[0] 。

有了這個方法,那麼我們就可以在o(n)的時間內算出所有排列的最小逆序對數了。總的時間複雜度是o(nlogn)。

ac**如下:

#include#define maxn 9999999

int bit[maxn],n,a[maxn];

int lowbit(int k)

int min(int a,int b)

return s;

} int main()

min=sum;

/* for(int i=1;i*/

printf("%lld\n",min);

return 0;

}

HAOI 2009 逆序對數列

haoi 2009 逆序對數列 對於乙個數列,如果有iaj,那麼我們稱ai與aj為一對逆序對數。若對於任意乙個由1 n自然數組成的 數列,可以很容易求出有多少個逆序對數。那麼逆序對數為k的這樣自然數數列到底有多少個?第一行為兩個整數n,k。寫入乙個整數,表示符合條件的數列個數,由於這個數可能很大,你...

HAOI2009 逆序對數列

題目大意 求 1,n 的自然數的排列中逆序對數為 k 的有多少.無優化 include include const int mod 10000 int f 1005 1005 int main printf d n f n k return 0 優化 include include const in...

HAOI2009 逆序對數列

對於乙個數列,如果有iaj,那麼我們稱ai與aj為一對逆序對數。若對於任意乙個由1 n自然數組成的數列,可以很容易求出有多少個逆序對數。那麼逆序對數為k的這樣自然數數列到底有多少個?輸入格式 第一行為兩個整數n,k。輸出格式 寫入乙個整數,表示符合條件的數列個數,由於這個數可能很大,你只需輸出該數對...