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

2021-07-10 13:11:39 字數 1591 閱讀 1536

這名字起的。。

題意:給出兩數列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大於的極大的藥片的id 為 nxt[i]

那麼在前i個裡面的, 至少有j個滿足條件,其餘的不管。

f[i][j] = f[i-1][j] + f[i-1][j-1] * (nxt[i] - (j - 1))

然後發現(a1

然後容斥otz

思想是看f[n][i]中多餘i個的多算了多少次。 /*

f[i,j] = f[i-1,j] + f[i-1, j-1] * (nxt[i] - j + 1)

g[i] = f[n,i] * (n - i)! - sigma(c[k,i] * g[k])[k=[i+1,n]]*/

同bzoj舞會

#include 

#define maxn 2010

using namespace std;

int n, k, a[maxn], b[maxn];

int f[maxn][maxn], g[maxn], c[maxn][maxn], fac[maxn], nxt[maxn];

const int p = 1e9+9;

#define plus plus

int plus(int x, int y)

int dcrs(int x, int y)

int mul(int x, int y)

int main()

k = n + k >> 1;

for(int i = 1; i <= n; i ++) scanf("%d", &a[i]);

for(int i = 1; i <= n; i ++) scanf("%d", &b[i]);

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

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

c[0][0] = 1;

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

int j = 0;

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

f[0][0] = 1;

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

}fac[0] = 1;

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

fac[i] = 1ll * fac[i-1] * i % p;

for(int i = n; i >= k; i --)

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

return 0;}/*

f[i,j] = f[i-1,j] + f[i-1, j-1] * (nxt[i] - j + 1)

g[i] = f[n,i] * (n - i)! - sigma(c[k,i] * g[k])[k=[i+1,n]]

*/

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

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 的最後乙個...

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

已經使 modoka 有簽訂契約,和自己一起戰鬥的想法後 mami 忽然感到自己不再是孤單一人了呢.於是,之前的謹慎的戰鬥作風也消失了 在對 charlotte 的傀儡使用終曲 tiro finale後 mami 面臨著即將被 charlotte 的本體吃掉的局面.這時,已經多次面對過 charlo...