P2513 HAOI2009 逆序對數列

2022-05-05 19:45:09 字數 987 閱讀 7817

題目描述

對於乙個數列,如果有iaj,那麼我們稱ai與aj為一對逆序對數。若對於任意乙個由1~n自然數組成的數列,可以很容易求出有多少個逆序對數。那麼逆序對數為k的這樣自然數數列到底有多少個?

錯誤日誌: 沒想対, 菜是原罪, 最近狀態不佳

在一段 \(1 - (i - 1)\) 的排列中加入 \(i\) 你可以控制 \(i\) 插入的位置, 給這個排列的逆序對任意加上 \(1 - (i - 1)\) 對(從最右到最左插入)

於是想到狀態 \(dp[i][j]\) 表示為考慮 \(1 - i\) 的排列, 逆序對數為 \(j\) 的方案數

然後寫出狀態轉移方程:$$dp[i][j] = \sum_^dp[i - 1][j - k]$$

這樣列舉 \(k\), 複雜度為 \(o(nk^)\) 會炸

觀察這個式子, 令 \(t = j - k\) ,換一下元, 交換 \(sum\) 的上下邊界, 我們可以得到:$$dp[i][j] = \sum_^dp[i - 1][t]$$

發現 \(t\) 的範圍為一段可以維護和的區間, 字首和維護即可

#include#include#include#include#include#include#define ll long long

#define rep(i, x, y) for(int i = (x);i <= (y);i++)

using namespace std;

int rd()

while(c >= '0' && c <= '9')

return flag * out;

}const int maxn = 2019, m = 10000;

int num, k;

int dp[maxn][maxn];

int main()

} printf("%d\n", dp[num][k]);

return 0;

}

P2513 HAOI2009 逆序對數列

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

P2513 HAOI2009 逆序對數列

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

洛谷 P2513 HAOI2009 逆序對數列

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