題意描述:給你乙個有0--n-1數字組成的序列,然後進行這樣的操作,每次將最前面乙個元素放到最後面去會得到乙個序列,那麼這樣就形成了n個序列,那麼每個序列都有乙個逆序數,找出其中最小的乙個輸出!
解析:求出a1, a2, ..., an-1, an的逆序數之後,就可以遞推求出其他序列的逆序數。 假設要把a1移動到an之後,那麼我們把這個過程拆分成兩步:
1. 把a1去除掉。通過觀察可以發現,(a1-1)是0~n-1中比a1小的數字的個數,由於a1在序列的第乙個所以a1之後共有(a1-1)個比a1小,所以形成了(a1-1)對逆序數,當去除掉a1時,原序列的逆序數總數也就減少了(a1-1)個逆序數。
2. 把a1加到an之後。0~n-1中,比a1大的數共有(n-a1)個數,由於a1現在在最後乙個,也就是它前面共有(n-a1)個數比它大,即增加了(n-a1)對逆序數。
綜合1,2兩步, 設原序列逆序數為sum, 當把原序列第乙個移動到最後位置時,逆序數變為:sum = sum-(ai-1)+(n-ai);
3.由於此題範圍是0到n-1;所以sum = sum -(ai) + (n - 1 - ai);
#include#includeusing namespace std;
const int n = 5050;
struct node
tree[n*4];
void bulid(int rt ,int l,int r)
int search(int rt, int l,int r)
void update(int rt, int x)
/*void print(int rt)
*/
int main ()
printf("%d\n",min);
} return 0;
}
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 思路 先求出初始序列的逆序數,可以歸併,這裡用的是線段數求。設當...
hdu1394線段樹求逆序數
這個吧,就是這麼回事。你把每乙個數都插在相應的點上。然後,query來計算a i 道n的插得點個數,因為你是按順序插得。先插的而且還在後面。那麼一定構成逆序數。然後用sum儲存一下。還有逆序數的計算第乙個數放到最後,比他小的有x 1個,比他大的有n x個。然後給移到後面,逆序數增加n x 個,比x小...
hdu1394 線段樹求逆序數
題意 給出一串數字a,可以進行如下操作 將該串數字第乙個數字a0放到該串數字的最後位置,形成新的數字串,求操作過程中最小逆序數。思路1 求一串數字的逆序數 暴力法 對每乙個數字x,判斷x與x之前出現了多少個比x大的數字。複雜度為o nn 利用線段樹 因為數字串出現的數字只能在區間0 n,可以利用線段...