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

2022-03-18 10:26:58 字數 1594 閱讀 9934

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

題意:給n個數ai,n個數bi,將ai中的數與bi中的數配對,求配對ai比bi大的比bi比ai大的恰好有k組的方案數。n,k≤2000

題解:蒟蒻太弱了只能引用神犇題解

我們將兩個讀入的陣列排序,令 next[i] 表示最大的 j 滿足 a[i]>b[j],令f[i][j]表示列舉到第i個a時,有j組a>b,但剩下的情況是不考慮的,則f[i][j]=f[i-1][j]+f[i-1][j-1]*(next[i]-j+1)。但若把 f[n][s] 直接輸出會wa因為會有這種情況出現:

a1,a2,a3

b1,b2,b3

a1>b1  a2>b2  a3>b3

那麼((a1,b1),(a2,b2),a3不明)和((a1,b1),(a3,b3),a2不明)就會被視為兩種答案,可見我們要求出的是 f』[n][s] 表示n個a,有s組a>b,剩下的都是b>a

這裡就要用容斥了

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

(n-i)!是列舉後面 n-i 可能的方案,f『[n][j]*c(j, i) 表示 f[n][i] 中實際有 j 組b>a卻被計入f[n][i]的數量

f'[n][s]就是答案了,總時間複雜度為 o(n2)

c(j,i)要遞推,不然要溢位。

**:

1 #include 2 #include 3 #include 4

#define inc(i,j,k) for(int i=j;i<=k;i++)

5#define dec(i,j,k) for(int i=j;i>=k;i--)

6#define maxn 2100

7#define mod 1000000009

8#define ll long long

9using

namespace

std;

1011

ints[maxn],p[maxn],next[maxn],n,k; ll f1[maxn][maxn],f2[maxn],c[maxn][maxn],p[maxn];

12 inline int

read() while(ch>='

0'&&ch<='

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

0',ch=getchar();

15return f*x;16}

17int

main() k=((n-k)>>1)+k;

19 inc(i,1,n)s[i]=read(); inc(i,1,n)p[i]=read(); sort(s+1,s+n+1); sort(p+1,p+n+1

);20

int l=1; inc(i,1,n)

21 f1[0][0]=1; inc(i,1,n)

22 p[0]=1; inc(i,1,n)p[i]=p[i-1]*(ll)i%mod;

23 inc(i,0,n)

24dec(i,n,k)

28 printf("

%lld

",f2[k]); return0;

29 }

20160610

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