简单,但很有意思
D. Robot Vacuum Cleaner
题目:给一些由“s”和“h”组成的字符串,把这些字符串拼接起来,贡献是所有“h”前面“s”的个数的和。
思考过程:一开始不知道怎么下手,但是可以分析出来一些性质
- 每个串内部的贡献是可以单独计算的(虽然没什么意义)
- 前后两个串是第一个的“s”与第二个的“h”相关(
好像也没什么用) - “s”和“h”的数量是固定的(看起来好像没用,证明却少不了)
- 这个字符串好像具有传递性?
咳咳,根据qbxt长者的至理名言——“大胆猜测,从不验证,轻松爆零”来看,似乎是有点道理的。于是我就试了试,就A了。
事后来证明一下,似乎是很有道理的。
感性证明:
首先,两个字符串之间先后顺序很好决定,直接判断就ok
其次,我们如何证明传递性?
令
a
a
优于 且
b
b
优于
可得
sa∗hb>sb∗ha
s
a
∗
h
b
>
s
b
∗
h
a
,
sb∗hc>sc∗hb
s
b
∗
h
c
>
s
c
∗
h
b
移项得
sa/ha>sb/hb
s
a
/
h
a
>
s
b
/
h
b
,
sb/hb>sc/hc
s
b
/
h
b
>
s
c
/
h
c
所以
sa/ha>sc/hc
s
a
/
h
a
>
s
c
/
h
c
再移项得
sa∗hc>sc∗ha
s
a
∗
h
c
>
s
c
∗
h
a
传递性得证。
E. Birds
题目:给几颗树(有顺序),树上有
ci
c
i
只鸟,把第
i
i
颗树的鸟打下来要花费体力。人从第一颗树往后走,每走过一棵树体力上限增加
B
B
,同时体力也会回复。问最多能打多少只鸟。
思考过程:没什么过程,一看就是多重背包dp,非常无趣,数据范围还很小。
F. Divisibility
题目:给
n
n
和两个整数,求一个集合
I
I
满足,其中函数
f(I)
f
(
I
)
定义为集合
I
I
内满足以下条件的数对(a,b)的个数:
-
-
a|b
a
|
b
思考过程:首先,这肯定是个数论。然后看到复杂度,是30W级别的,猜测算法的复杂度。然后,这个东西是跟整除有关系,也就是约数之类的,有可能是反演。但是要求是整除,限制大了很多,因此可能性不大。所以还是考虑dp之类的,甚至是结论题。经历一番思考发现,好像都不太对,似乎没有这么(难)简单。因此从性质入手考虑。
性质:
- 集合之间,包含关系即单调关系(个数越多数对越多)
- 不会有某一个元素能贡献的价值超过总价值的一半(除了2)
- 由上一个性质可以推出如果存在
f(I)≥k
f
(
I
)
≥
k
那么存在
f(I)=k
f
(
I
)
=
k
- 由上一个性质可以推出,
n
n
<script type="math/tex" id="MathJax-Element-4178">n</script>是单调的
然后利用这些性质能够直接递归子问题求解。
最后
至于为什么没有a、b、c?
- 懒
- 简单
cf什么时候能让我做div1???