# BZOJ 4742: [Usaco2016 Dec]Team Building

## 4742: [Usaco2016 Dec]Team Building

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 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.

(1 ≤ N ≤ 1000, 1 ≤ M ≤ 1000)。每只牛都有自己的分数。两人会选择K只牛组成队伍(1 ≤ K ≤ 10)，两队

## 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

382

## Source

[Submit][Status][Discuss]

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                 {
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

posted @ 2017-01-05 19:48  YouSiki  阅读(445)  评论(0编辑  收藏  举报