2021.09.22PM
|
预期 |
实际 |
| A |
100 |
0 |
| B |
10 |
20 |
| C |
100 |
50 |
| D |
100 |
100 |
| S |
310 |
170 |
可能水,一定菜 |
|
|
A 亲戚 \(\blacktriangle\)
- 并查集超级模板题
- 很好奇怎么是省选题的(
内卷越来越严重)
B 文本生成器 \(\blacktriangle\!\blacktriangledown\)
- 由于找成立的数目非常难搞(比如\(aba\)就会在不同位置会重复很多相同情况,难以计算),所以我们考虑找不成立的情况。
- 即使前面的都匹配上了,只要最后一个匹配不上也是不成立的。
- 但同时也会有其它重叠的情况(比如\(abac\),\(abab\) 虽然不成立,但是与原串有重叠),一个串是 \(KMP\) ,而这是多个串,故为
WA自动机
- 我们设\(DP[][j]\),表示现在在trie 树的 i 节点 j 字符,初始化 \(DP[0][0]=1\),按 trie 树跑 fail指针,如果当前位置标记为单词就跳过。
是不是非常简单
C 专用牛棚 \(\blacktriangle\)
- 一道比较基础的贪心题。
- 首先通过感觉找到一个性质:喝水时间左端点最靠前的牛是必须要开一个Stall的
- 再通过矛盾关系,能得到另一个性质:和所有Stall的占用区间都矛盾的是必须要开一个Stall的。
- 根据这两个性质,能得出第一个策略:先按左端点进行排序。
- 全部矛盾再开一个就行,但是不矛盾放哪个更优呢?
- 因为我们已经按左端点排过序了,不可能出现左端点比这个还靠前的,所以选择左端点最靠右的能成立的是没有必要的。
- 由此可得,我们可以用一个优先队列维护当前各个Stall的右端点,从小到大排序,如果左端点小于最小的Stall的右端点,则只能新开,否则更新并重新放进堆。
D 蚂蚁搬沙 \(\blacktriangle\!\blacktriangledown\)
- 看到这道题我的第一想法是哈弗曼编码树。
- 不过确实关系很大,可以理解为加强版。
- 每次从堆中贪心地选出 \(K\) 个最小的数进行合并,这样得出来的就类似于一棵除叶子节点外出度均为 \(K\) 的树。
- 最大的问题是和哈弗曼编码树有些差别,按这样取最上面一层可能不满,这显然不是最优。我们期望最底下一层不满,那就向堆里补0
- 但是0的数目很有讲究。因为每次从都是从堆里取出 \(K\) 个数再放进去1个数,我们只需要模拟这个过程,就能知道最后放多少0(考试的时候我傻掉了不知道填多少就跑了两次,第一次不补看最后差几个数,第二次补后跑答案)
![image]()
\(\cal {Made} \ {by} \ {YuGe}\)
posted @
2021-09-24 14:50
u2003
阅读(
25)
评论()
收藏
举报