2021.09.22pm

2021.09.22PM

预期 实际
A 100 0
B 10 20
C 100 50
D 100 100
S 310 170
可能水,一定菜

A 亲戚 \(\blacktriangle\)

  1. 并查集超级模板题
  2. 很好奇怎么是省选题的(内卷越来越严重

B 文本生成器 \(\blacktriangle\!\blacktriangledown\)

  1. 由于找成立的数目非常难搞(比如\(aba\)就会在不同位置会重复很多相同情况,难以计算),所以我们考虑找不成立的情况。
  2. 即使前面的都匹配上了,只要最后一个匹配不上也是不成立的。
  3. 但同时也会有其它重叠的情况(比如\(abac\)\(abab\) 虽然不成立,但是与原串有重叠),一个串是 \(KMP\) ,而这是多个串,故为WA自动机
  4. 我们设\(DP[][j]\),表示现在在trie 树的 i 节点 j 字符,初始化 \(DP[0][0]=1\),按 trie 树跑 fail指针,如果当前位置标记为单词就跳过。是不是非常简单

C 专用牛棚 \(\blacktriangle\)

  1. 一道比较基础的贪心题。
  2. 首先通过感觉找到一个性质:喝水时间左端点最靠前的牛是必须要开一个Stall的
  3. 再通过矛盾关系,能得到另一个性质:和所有Stall的占用区间都矛盾的是必须要开一个Stall的。
  4. 根据这两个性质,能得出第一个策略:先按左端点进行排序。
  5. 全部矛盾再开一个就行,但是不矛盾放哪个更优呢?
    • 因为我们已经按左端点排过序了,不可能出现左端点比这个还靠前的,所以选择左端点最靠右的能成立的是没有必要的。
    • 由此可得,我们可以用一个优先队列维护当前各个Stall的右端点,从小到大排序,如果左端点小于最小的Stall的右端点,则只能新开,否则更新并重新放进堆。

D 蚂蚁搬沙 \(\blacktriangle\!\blacktriangledown\)

  1. 看到这道题我的第一想法是哈弗曼编码树
  2. 不过确实关系很大,可以理解为加强版。
  3. 每次从堆中贪心地选出 \(K\) 个最小的数进行合并,这样得出来的就类似于一棵除叶子节点外出度均为 \(K\) 的树。
  4. 最大的问题是和哈弗曼编码树有些差别,按这样取最上面一层可能不满,这显然不是最优。我们期望最底下一层不满,那就向堆里补0
  5. 但是0的数目很有讲究。因为每次从都是从堆里取出 \(K\) 个数再放进去1个数,我们只需要模拟这个过程,就能知道最后放多少0(考试的时候我傻掉了不知道填多少就跑了两次,第一次不补看最后差几个数,第二次补后跑答案)
    image
    \(\cal {Made} \ {by} \ {YuGe}\)
posted @ 2021-09-24 14:50  u2003  阅读(25)  评论(0)    收藏  举报