Codeforces 922 div2 d、e、f

简单,但很有意思

D. Robot Vacuum Cleaner

题目:给一些由“s”和“h”组成的字符串,把这些字符串拼接起来,贡献是所有“h”前面“s”的个数的和。
思考过程:一开始不知道怎么下手,但是可以分析出来一些性质

  • 每个串内部的贡献是可以单独计算的(虽然没什么意义)
  • 前后两个串是第一个的“s”与第二个的“h”相关(好像也没什么用
  • “s”和“h”的数量是固定的(看起来好像没用,证明却少不了)
  • 这个字符串好像具有传递性?

咳咳,根据qbxt长者的至理名言——“大胆猜测,从不验证,轻松爆零”来看,似乎是有点道理的。于是我就试了试,就A了。

事后来证明一下,似乎是很有道理的。
感性证明:
首先,两个字符串之间先后顺序很好决定,直接判断就ok
其次,我们如何证明传递性?
a a 优于 b b b b 优于 c c
可得 sahb>sbha s a ∗ h b > s b ∗ h a sbhc>schb 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
再移项得 sahc>scha s a ∗ h c > s c ∗ h a

传递性得证。

E. Birds

题目:给几颗树(有顺序),树上有 ci c i 只鸟,把第 i i 颗树的鸟打下来要花费体力 costi c o s t i 。人从第一颗树往后走,每走过一棵树体力上限增加 B B ,同时体力也会回复 X X 。问最多能打多少只鸟。
思考过程:没什么过程,一看就是多重背包dp,非常无趣,数据范围还很小。

F. Divisibility

题目:给 n n k k 两个整数,求一个集合 I I 满足 f(I)=k f ( I ) = k ,其中函数 f(I) f ( I ) 定义为集合 I I 内满足以下条件的数对(a,b)的个数:
- ab a ≤ b
- a|b a | b
思考过程:首先,这肯定是个数论。然后看到复杂度,是30W级别的,猜测算法的复杂度。然后,这个东西是跟整除有关系,也就是约数之类的,有可能是反演。但是要求是整除,限制大了很多,因此可能性不大。所以还是考虑dp之类的,甚至是结论题。经历一番思考发现,好像都不太对,似乎没有这么()简单。因此从性质入手考虑。
性质:
- 集合之间,包含关系即单调关系(个数越多数对越多)
- 不会有某一个元素能贡献的价值超过总价值的一半(除了2)
- 由上一个性质可以推出如果存在 f(I)k f ( I ) ≥ k 那么存在 f(I)=k f ( I ) = k
- 由上一个性质可以推出, n n 是单调的
然后利用这些性质能够直接递归子问题求解。

最后

至于为什么没有a、b、c?

  1. 简单

cf什么时候能让我做div1???

你可能感兴趣的:(日常,刷子OIer签到墙)