zoukankan      html  css  js  c++  java
  • CF76C

    这是当年模拟赛的题,当时我不会高维前缀和,被 ymxdd 了/kk

    那么这是个 2700 的远古题,那么真实难度到底是高还是低呢/yiw


    Portal

    首先我们考虑枚举每个删除字符的集合,对于每个集合都算出代价判一下。代价显然分为删除字符后得到的字符串中相邻字符对的总代价,加上删除字符的代价。后者显然随便求就可以了,难点在于前者。

    如果想对于每个删除集合,单独算出前者代价,那是没有前途的。我们注意到,在删除一些字符后剩下来的字符串中,我们可以看做每个相邻字符对的左边那个字符对它做了一些贡献。于是我们考虑转换贡献体,换成左边字符,就是说对于每个字符,我们考虑它能作为相邻字符对中的左边字符影响哪些删除集合并贡献上去。

    于是我们枚举字符,对于每个字符,考虑它后面能够接哪些字符(或是最后一个,后面不接,或当前字符不存在),对于接不同字符的贡献是不同的。对于它后面接字符 (x),那么它在原串中的位置显然是当前枚举到的字符后的第一个 (x),中间那些全要删掉,(x) 和当前字符必须留下,其他的字符就删不删没关系,这时候贡献是当前字符与 (x) 相邻时的代价。那么显然一共有 (mathrm O(m)) 种情况,随便维护一下即可。

    那么对于每种情况,它能贡献到的删除集合的集合显然是:那些必须删和那两个必须不删的是固定的,其他 (0/1) 均可。这个该如何维护呢?这个范围显然是个 (m) 维超立方,考虑高维差分,最后再高维前缀和回去。但是众所周知,高维差分是我所不会 (mathrm O(m))(或者可能根本就不可做),那怎么办呢?注意到差分中的一个特例,如果某维的 (r+1) 要大于值域,那它就不会起效果,可以忽略;在本题中,如果超立方的某维的右端点等于 (1) 那就不用给总复杂度乘以 (2)。那显然 (0/1) 均可和必须删的都是 (r=1),只有两个是 (r=0),那差分就是常数级别了。注意这两个可能重合,讨论一下即可。

    code

    珍爱生命,远离抄袭!
  • 相关阅读:
    单例模式
    关于static
    在O(1)时间复杂度删除链表节点
    奇偶分割数组
    用栈实现队列
    前序遍历和中序遍历树构造二叉树
    扇贝每日一句_1006
    寻找旋转排序数组中的最小值
    翻转链表
    扇贝每日一句_1002
  • 原文地址:https://www.cnblogs.com/ycx-akioi/p/solution-cf76c.html
Copyright © 2011-2022 走看看