• CodeForces Global Round 1


    CodeForces Global Round 1

    CF新的比赛呢(虽然没啥区别)!这种报名的人多的比赛涨分是真的快。。。。
    所以就写下题解吧。

    A. Parity

    太简单了,随便模拟一下就完了。

    B. Tape

    显然就是先找一个长的把所有的全部覆盖,然后可以在上面丢掉(k-1)段间隙。
    那么把两两之间的间隙长度拿出来排序就可以了。

    C. Meaningless Operations

    如果(a)不等于(2^k-1)的形式,那么令(S=2^k-1),其中(2^{k-1}<a<2^k)
    那么令(b=Soplus a),那么(aoplus b=S,a&b=0),那么此时的(gcd=S),为最大值。

    否则(a=S),那么(gcd=gcd(a-b,b)),这是一个辗转相减的形式,等于(gcd(a,b)),所以(b)(a)的最大的不等于(a)的约数。

    D. Jongmah

    显然对于(i)而言只可能和(i-2,i-1,i+1,i+2)凑顺子。
    而如果某个顺子超过了(3)个是没有意义的,所以一个顺子最多出现(2)次,所以(i)这个牌最多用(6)次,超过(6)的部分每(3)个直接凑起来。
    那么设(f[i][0..6][0..6])表示当前考虑的是(i),后面两维记录(i-1)的数量和(i-2)的数量。
    转移的时候枚举这个顺子的出现次数,随便转移一下就好了。

    E. Magic Stones

    (mbox{agc006_c})很类似啊。
    观察这个数列的操作,把它差分,发现差分后的操作等价于在差分数组上交换相邻两个数。
    所以只需要判断两个数列的差分数组排序后是否相等即可。
    注意要特判第一个数是否相等。

    F. Nearest Leaf

    考虑两个点之间的距离是(dep[u]+dep[v]-2*dep[LCA])
    那么我们把所有叶子节点的(dep[u])放在自己身上。对于一个询问(u),显然就是找最小的(dep[v]-2*dep[LCA])(dfs)整棵树,假如当前点作为(LCA)影响其子树内的询问,那么就是把它子树内的所有点权全部减去(2*dep[u]),这样子询问的时候,直接查区间最小值即可。线段树维护。

    G. Tree-Tac-Toe

    有神仙已经写得很好了,所以我就懒得写了
    注意一下别每次(memset),每次手动(for)清空数组。

    H. Modest Substrings

    如果满足条件的串很少的话,显然全部丢到(AC)自动机里面去(dp)
    问题就在于这样子符合条件的串很多。
    考虑压缩状态,不难发现很多自动机上的状态都是满的,即可以随意选择子串都能匹配上。
    什么样的点的子树是满的呢?对于(ge l)而言,符合了前缀之后,下一位大于(l)的这一位的所有节点。对于(le r)是类似的。
    那么一共有(Sigma(|l|+|r|))个满状态的节点,注意(Sigma)是字符集大小。
    对于每个满状态的节点,设(g[u][x])表示从(u)节点开始,往下任意走(x)步,能够到达的合法的串的个数,这个东西在构建(AC)自动机的时候可以很容易的得到。
    那么直接(dp)就好了。。。。
    说不清所以看代码吧。。。。
    代码

  • 相关阅读:
    给定中序和后序遍历,求前序序列(C++递归方式实现)
    myeclipse2014删除antlr-2.7.2.jar--解决struts和hibernate包冲突
    hadoop1.2.1配置与运行子串统计程序
    任务计划crontab
    建NTP
    vnc下运行runInstall报java错误
    rpm软件安装
    redis
    rpm包和deb包转换
    新老版本centos下载
  • 原文地址:https://www.cnblogs.com/cjyyb/p/10364983.html
Copyright © 2020-2023  润新知