LGP4859, 一類奇怪的容斥套DP

2022-03-01 19:07:10 字數 1080 閱讀 4712

漫山遍野都是fake的光影。

[lgp4859] 已經沒有什麼好害怕的了

給定兩個長度為n的陣列a和b,將a中元素與b中元素配對,求滿足ai>bj的配對(i,j)個數減去滿足ai

[某年noi歡樂賽] 決鬥

給定兩個長度為n的陣列a和b,將a中元素與b中元素隨機配對,求滿足ai≥bj的配對(i,j)個數k次方的期望。

對於前乙個問題,我們轉換為求滿足ai>(≥)bj的配對(i,j)恰好為k=(n+k)/2的方案數。這樣就能與第二個問題形式上保持一致。稱這樣配對的配對為「配對」(霧)。

其次將ab從小到大排序,然後依次為a陣列配對,設f[i,j]表示前i個位置上確定了j個「配對」的方案數(跳過剩下的i-j對不為「配對」的配對的轉移),w[i]表示滿足bj≤ai的最大的j,有轉移 f[i,j]=f[i-1,j]+f[i-1,j-1]*(w[i]-j+1)。後邊那個係數其實是(w[i]-w[i-1])+(w[i-1]-(j-1))得來的。

考慮對f[n,i]統一確定剩下的(n-i)個配對,記g[i]=f[n,i]*(n-i)!。顯然g[i]的統計是有重複的。具體的,設h[i]為恰好有i個「配對」的方案數,h[i]在g[j]中被統計c(i,j)次,其中i≥j。

即g[i]=σ[j≥i] h[j]*c(j,i),移項得h[i]=g[i] σ[j>i] h[j]*c(j,i),可以遞推求解了。

後乙個問題的後續操作已經不重要了你說是吧

#include #define ll long long

using namespace std;

const int n=2019;

const int mod=1e9+9;

int n,k,a[n],b[n],w[n],f[n][n],c[n][n];

int main()

k=(n+k)/2;

sort(a+1,a+n+1);

sort(b+1,b+n+1);

for(int i=1,j=0; i<=n; ++i)

printf("%d\n",w[k]);

return 0;

}

C 類的理解 一) 類的初識

一 類的意義,以及類與物件 類的內容比較多,但類是物件導向的基礎,所謂物件導向 object 其實就是一種更高層次的模組化,也稱為封裝。c語言中,稍微複雜點的資料結構都是用結構體來寫的,結構體本質上就是把一些相關的資訊打包儲存,比如貓 struct cat 這樣我們通過鍵盤輸入很多貓的資訊就可以用結...

Integer一類的比較問題

總體主要分為兩個方面 比較的是值 一 基本資料型別與引用資料型別進行比較時,引用資料型別會進行拆箱 自動拆裝箱需要在jdk1.5以上 然後與基本資料型別進行值的比較 舉例 int i 12 integer j new integer 12 i j 返回的是true 二 引用資料型別與基本資料型別進行...

演算法 Fibonacci 數列的一類問題(一)

fibonacci 是演算法中的基礎問題。還有一些問題本質是fibonacci 問題,也就是遞迴問題。在此我們一併總結 1.fibonacci 數列 問題描述 數列位數序號 1,2,3,4,5,6,fibonacci 數列 1,1,2,3,5,8,fibonacci 數列的性質很簡單,就是從第三位起...