BZOJ 4742: [Usaco2016 Dec]Team Building

Posted You Siki

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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. 
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

Sample Output

382

HINT

 

Source

[Submit][Status][Discuss]

 

看到网上还没有人写题解,来抢百度的沙发好了(不知道抢的抢不上)。

 

就是一道水水的动态规划了:首先得给两个序列分别排个序,$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

 

以上是关于BZOJ 4742: [Usaco2016 Dec]Team Building的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 2100 Usaco2010 Dec Apple Delivery

bzoj4390: [Usaco2015 dec]Max Flow

bzoj 1692: [Usaco2007 Dec]队列变换

[BZOJ1692][Usaco2007 Dec]队列变换

BZOJ 1690 Usaco2007 Dec 奶牛的旅行

BZOJ 1717 Usaco 2006 Dec 产奶模式