題解 已經沒有什麼好害怕的了

2022-02-27 09:02:28 字數 1692 閱讀 6911

套路滿滿的樣子(o°ω°o) 實際上在發現『比...多 \(k\) 實際上就是要求糖果能量大於藥片能量的組數為 \(k'\) 時,這題的指向性就很明確了。按照慣例來說,我們應當試圖用『至少』來求出『恰好』的方案數。

先考慮容斥的部分:如果可以求出每乙個糖果集合 \(t\) 使得 \(t\) 中的所有糖果在最後的組合方案中能量都能夠大於所匹配的藥片的能量的方案數 \(h_\),那麼令

\(ans = \sum_^f_*h_\)

由於只要恰好為 \(k\) 的方案數

所以乙個『糖果大於藥片』組數為 \(t\) 的方案應對答案產生貢獻為:

\(g_=\sum_^f_*\binom=[x = k]\)

二項式反演,即可得:

\(f_=\sum_^(-1)^*\binom\)

解決了容斥係數,再考慮如何求出至少 \(i\) 組中糖果能量大於藥片能量的方案數?由於題目允許 \(n^\) 的複雜度,不妨大膽設dp狀態 \(dp[i][j]\) 表示將糖果與藥片均從小到大排序後,糖果組合到第 \(i\) 個,已經有 \(j\) 組糖果 > 藥片的方案數。考慮當前糖果是組合乙個比自己大的還是暫不考慮即可。最後求得的方案數中,雖然保證了有 \(x\) 組糖果 > 藥片,但並沒有對剩下的元素提出要求。所以都乘上乙個 \(fac[n - x]\) 即為所求。

完美解決ヾ(o´∀`o)ノ

#include using

namespace

std;

#define maxn 3005

#define cnst 3000

#define mod 1000000009

intn, k, ans, c[maxn][maxn], f[maxn][maxn];

intfac[maxn], g[maxn], rec[maxn], a[maxn], b[maxn];

intread()

while(c >= '

0' && c <= '

9') x = x * 10 + c - '

0', c =getchar();

return x *k;

}void up(int &x, int y)

void

pre()

void

dp()

for(int i = 1; i <= n; i ++) f[n][i] = 1ll * f[n][i] * fac[n - i] %mod;

}void

in_ex()

intmain()

else k = (n + k) >> 1

;

for(int i = 1; i <= n; i ++) a[i] =read();

for(int i = 1; i <= n; i ++) b[i] =read();

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

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

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

for(int j = 1; j <= n; j ++)

if(b[j] > a[i])

else

if(j == n) rec[i] =n;

dp(); in_ex();

printf(

"%d\n

", (ans + mod) %mod);

return0;

}

已經沒有什麼好害怕的了

給定乙個長度為n 只包含左括號和右括號的序列,求每乙個位置經過的合法子串有多少個。空串是乙個合法的串,如果a 和b 都是合法的串,那麼 a 和ab 都是合法的串。令a ns i 為第 i 位的答案,對於每組資料,輸出乙個整數an s 1 n an s i imo d p p 1 9 7 n 10 6...

已經沒有什麼好害怕的了

description 小y 最近開始學習演算法姿勢,但是因為小r 非常bb,給了她很多b6 題,所以她覺得自己已經沒有什麼前途了。於是小r 給了她一些稍微簡單的題,讓她覺得已經沒有什麼好害怕的了,其中一道是這樣的 給定乙個長度為n 只包含左括號和右括號的序列,現在小r 想要知道經過每乙個位置的合法...

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 開始忘...