BZOJ 4742: [Usaco2016 Dec]Team Building
4742: [Usaco2016 Dec]Team Building
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 21 Solved: 16
[Submit][Status][Discuss]
Description
Every year, Farmer John brings his NN cows to compete for "best in show" at the state fair. His arch
-rival, Farmer Paul, brings his MM cows to compete as well (1≤N≤1000,1≤M≤1000).Each of the N+MN+
M cows at the event receive an individual integer score. However, the final competition this year wi
ll be determined based on teams of KK cows (1≤K≤10), as follows: Farmer John and Farmer Paul both
select teams of KK of their respective cows to compete. The cows on these two teams are then paired
off: the highest-scoring cow on FJ's team is paired with the highest-scoring cow on FP's team, the s
econd-highest-scoring cow on FJ's team is paired with the second-highest-scoring cow on FP's team, a
nd so on. FJ wins if in each of these pairs, his cow has the higher score.Please help FJ count the n
umber of different ways he and FP can choose their teams such that FJ will win the contest. That is,
each distinct pair (set of KK cows for FJ, set of KK cows for FP) where FJ wins should be counted.
Print your answer modulo 1,000,000,009.
每年农夫约翰都会带着他的N只牛去集会上参加“你是最棒哒“的比赛。他的对手农夫保罗也带了M只牛去参加比赛
(1 ≤ N ≤ 1000, 1 ≤ M ≤ 1000)。每只牛都有自己的分数。两人会选择K只牛组成队伍(1 ≤ K ≤ 10),两队
牛在按分数大小排序后一一配对,并且约翰打败保罗当且仅当对于每一对牛,约翰的牛分数都比保罗的高。请帮助
约翰计算约翰打败保罗的方案数 mod 1000000009。两种方案不同,当且仅当约翰或保罗选择的牛的集合与另一种
方案不同。
Input
The first line of input contains N, M, and K. The value of K will be no larger than N or M.
The next line contains the N scores of FJ's cows.
The final line contains the M scores of FP's cows.
Output
Print the number of ways FJ and FP can pick teams such that FJ wins, modulo 1,000,000,009.
Sample Input
10 10 3
1 2 2 6 6 7 8 9 14 17
1 3 8 10 10 16 16 18 19 19
1 2 2 6 6 7 8 9 14 17
1 3 8 10 10 16 16 18 19 19
Sample Output
382
HINT
Source
看到网上还没有人写题解,来抢百度的沙发好了(不知道抢的抢不上)。
就是一道水水的动态规划了:首先得给两个序列分别排个序,$f[i][j][k]$表示使用FJ的前i头牛,以及FP的前j头牛,组出k头牛的战斗序列的方案数。$f[i][j][k]$向$f[i+1][j][k]$和$f[i][j+1][k]$转移,分别代表不选择FJ的第i头牛以及不选择FP的第j头牛,$f[i][j][k]$向$f[i+1][j+1][k+1]$转移当且仅当FJ的第i+1头牛能胜过FP的第j+1头牛。发现$f[i+1][j][k]$和$f[i][j+1][k]$向$f[i+1][j+1][k]$都有转移,而事实上这两次转移的方案是一样的,简言之,算重了,咋办,减掉就好,所以$f[i+1][j+1][k]-=f[i][j][k]$。
1 #include <cstdio> 2 #include <algorithm> 3 4 inline int nextChar(void) { 5 const int siz = 1024; 6 7 static char buf[siz]; 8 static char *hd = buf + siz; 9 static char *tl = buf + siz; 10 11 if (hd == tl) 12 fread(hd = buf, 1, siz, stdin); 13 14 return *hd++; 15 } 16 17 inline int nextInt(void) { 18 register int ret = 0; 19 register int neg = false; 20 register int bit = nextChar(); 21 22 for (; bit < 48; bit = nextChar()) 23 if (bit == '-')neg ^= true; 24 25 for (; bit > 47; bit = nextChar()) 26 ret = ret * 10 + bit - 48; 27 28 return neg ? -ret : ret; 29 } 30 31 const int siz = 1005; 32 const int mod = 1000000009; 33 34 int n, m, d; 35 36 int a[siz]; 37 int b[siz]; 38 39 int f[siz][siz][15]; 40 41 inline void add(int &a, int b) 42 { 43 a += b; 44 45 if (a >= mod) 46 a -= mod; 47 48 if (a < 0) 49 a += mod; 50 } 51 52 signed main(void) 53 { 54 n = nextInt(); 55 m = nextInt(); 56 d = nextInt(); 57 58 for (int i = 1; i <= n; ++i) 59 a[i] = nextInt(); 60 61 for (int i = 1; i <= m; ++i) 62 b[i] = nextInt(); 63 64 std::sort(a + 1, a + 1 + n); 65 std::sort(b + 1, b + 1 + m); 66 67 f[0][0][0] = 1; 68 69 for (int i = 0; i <= n; ++i) 70 for (int j = 0; j <= m; ++j) 71 for (int k = 0; k <= d; ++k) 72 if (f[i][j][k]) 73 { 74 add(f[i + 1][j][k], f[i][j][k]); 75 add(f[i][j + 1][k], f[i][j][k]); 76 add(f[i + 1][j + 1][k], -f[i][j][k]); 77 78 if (a[i + 1] > b[j + 1]) 79 add(f[i + 1][j + 1][k + 1], f[i][j][k]); 80 } 81 82 printf("%d\n", f[n][m][d]); 83 }
@Author: YouSiki