題目大意:給定乙個陣列a[n],輸入q次查詢(如b,c),輸出從a[b] 到a[c] 從在多少逆序數對
n只有1000
,剛開始居然n^3,一直沒想到,就在那裡推一維陣列,二維的閃現了一下但是忽略了。
仔細一想發現可以很簡單地做到n2
.設dp[l][r]表示從l~r的逆序對數量。首先我們暴力地先算好dp[
1][1..n]
。然後i
從2∼n
列舉,每次計算從i
開始的逆序對。
那麼dp[i][j]
比dp[i-1][j]
少了什麼呢?沒錯,少了a[
i−1]
這個數的貢獻。
我們再開乙個累加器cn
t 。列舉j 從
i∼n
,如果a[i-1]和a[j]構成逆序數,則cnt--;
最後dp[i
][j]
=dp[i
−1][
j]+c
nt[j
] 。預處理完所有的答案就可以o(
1)的詢問啦
#include #include #include #include #include using namespace std;
int dp[1005][1005];
int a[1005];
int cnt[1005];
int main()
dp[1][i] += dp[1][i-1];
}for(int i = 2 ; i <= n ; i ++ )
}for(int i = 0 ; i < q ; i ++ )
}return 0;
}
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個序列中最小逆序數 思路 乙個序列的逆序數可以用線段樹,或者暴力法求...
求N個元素的逆序數
求n個元素的逆序數 解法一 窮舉,時間複雜度為o n2 解法二 使用歸併排序計算逆序數,時間複雜度o n lngn 使用分治思想,以mid值將序列分為左序列 left mid 右序列 mid 1 right 將左右子串行排序好之後,進行合併。合併時獲得逆序數,因為左序列已經保證有序,當右序列的值小於...