題目描述
對於乙個數列,如果有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。輸出格式 寫入乙個整數,表示符合條件的數列個數,由於這個數可能很大,你只需輸出該數對...