2020.12.02【NOIP提高B组】模拟 总结
今天打到11点55分才交程序。
1.密码(substring)
用了三种方法。
(1)暴力
O
(
n
3
)
O(n^3)
O(n3)。
(2)用数学直接加一个和就
O
(
n
2
)
O(n^2)
O(n2)。
(3)设
f
i
,
j
f_{i,j}
fi,j表示
i
i
i后面字符
j
j
j的位置,转移,然后跳一下,时间
O
(
n
m
)
O(nm)
O(nm)。
应该可以过。
后面对拍发现傻逼错误,花了30分钟。
正解:
如上。
用类似
d
p
dp
dp法。
每次都跳一下。
每次都只会经过
m
m
m个点,所以单次为
O
(
m
)
O(m)
O(m)。
总结:
这种题目可以一看就是
O
(
n
m
)
O(nm)
O(nm)。
可以知道它是用加法原理或者求方案数的一些数学方法。
然后就可以打出
O
(
n
2
)
O(n^2)
O(n2)。
接着,因为
m
m
m很小,我们尝试只遍历串
B
B
B,所以用链表。
敲代码时要想后再打。
2.Adore
暴力
2
m
2^m
2m枚举变不变,20分。
然后用
d
p
dp
dp求路径数。
应该是
d
p
dp
dp。
正解:
以下状态就是路径数奇偶性的状态
设
f
i
,
j
f_{i,j}
fi,j表示在第
i
i
i层状态为
j
j
j的方案数,
h
(
i
)
h(i)
h(i)表示二进制
i
i
i含
1
1
1的个数是否为奇数。
对于第
i
i
i层,我们设
a
i
a_i
ai表示不取反去下一层的状态,
b
i
b_i
bi表示取反后去下一层的状态,
p
p
p为取反下一行的状态,
q
q
q为不取反下一行的状态。
可知
p
=
∑
i
=
1
k
h
(
a
i
&
j
)
2
j
\begin{aligned}p=\sum_{i=1}^{k}{h(a_i\&j)2^j}\end{aligned}
p=i=1∑kh(ai&j)2j,
q
q
q类似。
然后转移:
f
i
,
p
=
∑
f
i
−
1
,
j
f_{i,p}=∑f_{i-1,j}
fi,p=∑fi−1,j
答案显然,就是
f
n
−
2
,
s
f_{n-2,s}
fn−2,s(满足路径数为偶数)。
总结:
比赛时没想到如何列状态转移方程。
下次看到
k
k
k这么小就可以知道是状压
d
p
dp
dp。
转移方程要看一下有什么性质,比如说
k
k
k个路径数因为必须是偶数,所以就用
0
/
1
0/1
0/1表示偶数/奇数。
知道第
1
1
1维一定是层数。
然后发现时间复杂度是
O
(
n
k
2
k
)
O(nk2^k)
O(nk2k),要卡一下常数。
3.Confess
用暴力做
n
3
n^3
n3,20分。
完全不会优化。
可能是数学。
正解:
题解说是随机算法,因为有
n
n
n的数保证可以。
证明用到组合数。
总结:
有时候要大胆猜结论。
遇到不会的题,打了部分分后。
分大数据和小数据处理,大数据用结论,小数据用暴力。
4.Repulsed
不会做。
可能是树形
d
p
dp
dp。
没打暴力。
正解:
树形
d
p
dp
dp+贪心。
设
g
x
,
k
g_{x,k}
gx,k表示
x
x
x子树下距离为
k
k
k需要的灭火器数,
f
x
,
k
f_{x,k}
fx,k表示
x
x
x子树下距离为
k
k
k多余的灭火器。
然后用神仙贪心即可。
总结:
不要拘束于
d
p
dp
dp,要多想贪心算法。