解題思路:這道題是求迴圈陣列中逆序數最小值,求逆序數這裡肯定是用樹狀陣列。只是這裡有一點點變化,由於題目中n位數是0-n-1的乙個排列,所以num[i]可表示為比num[i]小的數的個數。把第一位的數挪到最後一位,那麼整個序列的逆序數變化為ans =ans - num[0] + (n-1-num[0]),num[0]表示後面的n-1位對逆序數的貢獻,n-1-num[0]表示把最後一位挪過來對逆序數所作出的貢獻。由於最小是為0,所以更新樹狀陣列時多加個1。。
#include#include#include#includeusing namespace std;
const int maxn = 5005;
int num[maxn];
int n,tree[maxn<<2];
int lowbit(int x)
void update(int x,int d)
}int getsum(int x)
return sum;
}int main()
int ans = 0;
for(int i = 1; i <= n; i++)
int min = ans;
for(int i = 1; i <= n; i++)
cout << min << endl;
} return 0;
}
HDU 1394 樹狀陣列求逆序數
題意 給你n個數,每次將其第乙個元素放後面,要你算出這期間所產生的最小逆序數。題解 首先用樹狀陣列求出原序列所產生的逆序數,然後根據性質算出公式sum n a i 1 a i 具體結合 更好理解。include include include using namespace std const in...
hdu 1394 求逆序數
首先建立空樹,將 a i 逐個插入 計算乙個序列n排列的最小逆序數 首先用線段樹算出出事序列的逆序數,然後找規律推出排列的最小逆序數。include include include include include include include include include include inc...
HDU1394 求逆序數
hdu1394minimum inversion number 逆序數 a i 後面比它小的數的個數即為a i 的逆序數,題目要求的是序列的逆序數,求和即可 題意 乙個由0.n 1組成的序列,每次可以把隊首的元素移到隊尾,求形成的n個序列中最小逆序數 思路 乙個序列的逆序數可以用線段樹,或者暴力法求...