Bzoj3622 已經沒有什麼好害怕的了

2022-05-13 17:45:39 字數 1968 閱讀 1793

這題的題面全是圖,而的圖隨時有掛的危險……

反正能去bzoj找原題,已經沒什麼好害怕的了

time limit: 10 sec  memory limit: 256 mb

submit: 476  solved: 231

4 25 35 15 45

40 20 10 30

4輸入的2*n個數字保證全不相同。

還有輸入應該是第二行是糖果,第三行是藥片

2014湖北省隊互測week2

喪心病狂的動態規劃+容斥原理。

一般看到是省隊級別的題我就慫了,然而這題題面太清奇,忍不住想做……絞盡腦汁看題解終於想明白了

先把兩個數列a,b從小到大排序。

設f[i][j]表示前i對數中,滿足糖果大於藥片的對數「至少」有j對的方案數。

總共要組n對數,其中糖果大於藥片的組數比藥片大於糖果的組數多k組,那麼總共需要 m=(n+k)/2 對數滿足糖果大於藥片,剩下的滿足藥片大於糖果。

先用next陣列記錄對於a中的每個數,在j中有next[i]個數比它小,則a[i]可以和next[i]個數組成糖果大於藥片的數對。

進行dp: f[i][j]=(f[i-1][j]+f[i-1][j-1]*max(next[i]-(j-1),0)%mod

這樣求出來的是「至少」有j對的方案數,而我們需要的是「恰好」有m對的方案數。

顯然(並不)這是乙個容斥問題:

f[n][i]表示總共n對數中,至少有i對數滿足「糖果大於藥片」。在a數列中,剩下的(n-i)個數各自要找b數列中剩下的乙個數配對,方案共有 (n-i)!  (←階乘) 種。

設dp[n][i]=「n對數中恰好i對數滿足糖果大於藥片」的方案數,則dp[n][i] = f[n][i]*(n-i)! -多餘部分

接下來分析多餘部分:

若j>i,在dp[n][j]中(這裡的dp[n][j]是已經算完的正確答案,為此需要倒序計算)的一部分可能會被算進f[n][i]中,這種誤算的方案有c[j][i]*dp[n][j]種。

所以: dp[n][i]=f[n][i]*(n-i)! - ( σ(i

之後發現dp陣列只用到了[n][i],所以第一維可以扔掉了

這可能是我至今寫過最長的分析了

もう何も怖くない...じゃねよ!

1

/*by silvern

*/2 #include3 #include4 #include5 #include6 #include7 #include8

#define ll long long

9using

namespace

std;

10const

int mod=1e9+9;11

const

int mxn=2010;12

intread()

15while(ch>='

0' && ch<='9')

16return x*f;17}

18int

n,m;

19int a[mxn],b[mxn];//

糖果和藥片

20int

nxt[mxn];

21 ll f[mxn][mxn];//

前[i]組中,有[j]組糖果數大於藥片數

22ll dp[mxn];

23ll c[mxn][mxn],jc[mxn];

24void

clc()

34int

main()

46clc();

47//

init

48for(i=0;i<=n;i++)f[i][0]=1;49

for(i=1;i<=n;i++)

50for(j=1;j<=i;j++)

53for(i=n;i>=m;--i)58}

5960 printf("

%lld\n

",dp[m]);

61return0;

62 }

bzoj 3622 已經沒有什麼好害怕的了

我好害怕這種題 兩個陣列排序後,處理出next i 表示滿足tang i yao j 的最大的j。f i j 前i種糖果,有j個糖比藥多,不考慮剩餘情況的方案數 也就是剩餘n j個糖果的放法算一種,最後乘上階乘。f i j f i 1 j f i 1 j 1 max next i j 1,0 開始忘...

BZOJ 3622 已經沒有什麼好害怕的了

這名字起的。題意 給出兩數列a,b都有n個元素,元素兩兩互不相同,問有多少種方案使得恰好 a i b j 的數目 a i b j 的數目 k?轉化 恰好有a i b j 的數目 n k 2 如果n k為奇數無解。link here 蒟蒻連普通dp也想不到啊otz 首先將糖果藥片們排序 設糖果i大於的...

BZOJ3622 已經沒有什麼好害怕的了

題意 給定兩個長度為n的互不相同的序列,將其兩兩配對,求有多少種配對使得a i b i 的對數減去其他對數恰好為k。一道經典的計數題,但思路理清後發現並不算難。首先設x為a i 小於b i 的對數。x x k n 2 x n k 所以當n k為奇數,答案為0。先令ne i 表示小於a i 的最後乙個...