失望……
B题其实很简单,完全有能力出,我和luyi陷在我一个错误的树DP模型中……
其实就是几个简单的组合数,谁可以都会的问题。
![ContractedBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1
#include
<
iostream
>
2 #include < algorithm >
3 #include < cstring >
4 #include < cstdio >
5 #include < string >
6 #include < numeric >
7 using namespace std;
8 const int N = 1011 ;
9 const long long MOD = 1000003 ;
10 const int M = 1011 ;
11 struct node
12 {
13 int v, s;
14 node * left, * right;
15 }pool[N], * root, * pp;
16
17 int a[N], b[N];
18 long long dp[N][M], c[N][N];
19 int n, m;
20 void preprocess()
21 {
22 for ( int i = 1 ;i < N;i ++ )
23 {
24 c[i][ 0 ] = 1 ;
25 c[i][i] = 1 ;
26 for ( int j = 1 ;j < i;j ++ )
27 c[i][j] = (c[i - 1 ][j] + c[i - 1 ][j - 1 ]) % MOD;
28 }
29 }
30
31 node * newNode( int v)
32 {
33 pp -> left = pp -> right = NULL;
34 pp -> v = v;
35 pp -> s = 1 ;
36 return pp ++ ;
37 }
38
39 void insert(node * & root, int v)
40 {
41 if (root == NULL)
42 {
43 root = newNode(v);
44 return ;
45 }
46 root -> s ++ ;
47 if (v > root -> v)
48 insert(root -> right, v);
49 else
50 insert(root -> left, v);
51 }
52
53 long long dfs(node * root)
54 {
55 long long ans = 1 ;
56 if ( ! root)
57 return ans;
58 if (root -> left && root -> right)
59 ans *= c[root -> left -> s + root -> right -> s][root -> left -> s];
60 ans = ans * dfs(root -> left) % MOD;
61 ans = ans * dfs(root -> right) % MOD;
62 return ans;
63 }
64
65 int main()
66 {
67 int cases;
68 preprocess();
69 scanf( " %d " , & cases);
70 while (cases -- )
71 {
72 scanf( " %d %d " , & n, & m);
73 root = NULL;
74 pp = pool;
75 for ( int i = 0 ;i < n;i ++ )
76 {
77 scanf( " %d " , & a[i]);
78 insert(root, a[i]);
79 }
80 printf( " %lld\n " , (c[m][n] * dfs(root)) % MOD);
81 }
82 return 0 ;
83 }
2 #include < algorithm >
3 #include < cstring >
4 #include < cstdio >
5 #include < string >
6 #include < numeric >
7 using namespace std;
8 const int N = 1011 ;
9 const long long MOD = 1000003 ;
10 const int M = 1011 ;
11 struct node
12 {
13 int v, s;
14 node * left, * right;
15 }pool[N], * root, * pp;
16
17 int a[N], b[N];
18 long long dp[N][M], c[N][N];
19 int n, m;
20 void preprocess()
21 {
22 for ( int i = 1 ;i < N;i ++ )
23 {
24 c[i][ 0 ] = 1 ;
25 c[i][i] = 1 ;
26 for ( int j = 1 ;j < i;j ++ )
27 c[i][j] = (c[i - 1 ][j] + c[i - 1 ][j - 1 ]) % MOD;
28 }
29 }
30
31 node * newNode( int v)
32 {
33 pp -> left = pp -> right = NULL;
34 pp -> v = v;
35 pp -> s = 1 ;
36 return pp ++ ;
37 }
38
39 void insert(node * & root, int v)
40 {
41 if (root == NULL)
42 {
43 root = newNode(v);
44 return ;
45 }
46 root -> s ++ ;
47 if (v > root -> v)
48 insert(root -> right, v);
49 else
50 insert(root -> left, v);
51 }
52
53 long long dfs(node * root)
54 {
55 long long ans = 1 ;
56 if ( ! root)
57 return ans;
58 if (root -> left && root -> right)
59 ans *= c[root -> left -> s + root -> right -> s][root -> left -> s];
60 ans = ans * dfs(root -> left) % MOD;
61 ans = ans * dfs(root -> right) % MOD;
62 return ans;
63 }
64
65 int main()
66 {
67 int cases;
68 preprocess();
69 scanf( " %d " , & cases);
70 while (cases -- )
71 {
72 scanf( " %d %d " , & n, & m);
73 root = NULL;
74 pp = pool;
75 for ( int i = 0 ;i < n;i ++ )
76 {
77 scanf( " %d " , & a[i]);
78 insert(root, a[i]);
79 }
80 printf( " %lld\n " , (c[m][n] * dfs(root)) % MOD);
81 }
82 return 0 ;
83 }
小猴一样是半调子……喊了半年了博弈依然没有学,他的数学底子是很好的,但是已经挥霍太多了……
我们现在攻关强题的能力完全没有,唯一能保证的就是简单题的1A……
接下来会越来越艰难。
新成立的IF队的实力很强,在少一人的情况下一样可以完虐我们。epic更不用说了,是今天的一队,实力更在我们之上。
ACMaster经过了长时间的磨合,实力也比我们强,而且相比于我们他们的个人实力都比较综合,尤其是ALEX,discover是数学强人,小猴这样半调子下去根本没法比。
新成立的TMP在少一人的情况下,依然和我们是平手……
我真的希望明年能有一个金牌……但是现实是残酷的,以队伍现在的实力真的是没法取得什么样的成绩。
不知近年是否有我们出去比赛的机会了,我希望能多见识一下场面,但是复旦已经决定由ACMaster和epic出战了机会估计是没有了吧
接下来好好备战吧,省赛四省赛要取得好的成绩呀!
下周一定要把按位DP搞定,不能再拖了!