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