zoukankan      html  css  js  c++  java
  • 省选模拟93 题解

    A. A
    肯定是用子序列自动机。然后暴力就是预处理出 DAG 上的路径数然后强行跑。
    优化的方法类似重链剖分,设 (f_i) 表示节点 (i) 之后的路径数。
    (f_i) 等于每个转移边的加和。考虑求出每个节点的重转移。
    (f_i<inf),重转移为每个转移中 (f) 值最大的。
    否则重转移为顺序枚举下使得 (f_i>inf) 的转移边。
    然后只要倍增重转移边即可。证明的方法只要分析 (f_i),每走一次轻边至少折半。
    另外一个问题是 (f_i=inf),可能不能折半。但是根据上述的构造方法,只会走一次轻边到 (f_i<inf) 的情况。

    B. B
    显然这题要用期望的线性性,然后考虑每张牌能产生贡献的概率。
    其实只与当前位置 (d) 的结果,最终位置模 (d) 的结果有关。
    所以做一个矩阵快速幂把概率求出来,然后随便累加一下答案即可。
    然后显然这题的转移矩阵是个循环矩阵,搞一下就可以去掉一个 (d)
    然后对于循环矩阵,可能没有必要每次都代入一个向量*转移矩阵。
    如果这 (n) 个向量也满足循环,那直接把 (n) 个向量压成一个矩阵然后乘转移矩阵就好了。

    C. C
    可以把 (1) 号点和 (n) 号点直接连一条边,于是问题转化为形成一个树形结构。
    设叶子个数为 (m),最后要连 (m) 条边也就是说有 (m+1) 个连通块。
    可以归纳证明这样一个事情,如果取出 (m+1) 个含有叶子的连通块,一定可以构造出一种连边方案使得只剩下一个连通块。
    具体来说取出一个独立点((2m) 个点,(m+1) 个连通块,所以存在),然后把这个独立点与另外一个点集中的非独立点之间连边(若另外一个点集均为独立点,那么存在 (m+1) 个独立点,仅当 (m=1) 可能成立)。
    通过这样的操作,把点数减少了 (2) ,连通块数减少了 (1),这是一个子问题。
    然后最小化删边其实就是最大加边,根据我不会的拟阵可以证明直接用类似最大生成树的贪心就是正确的。

  • 相关阅读:
    从尾到头打印链表
    在链表结尾插入一个结点 以及在 在链表中找到第一个含有某值的结点并删除该结点
    替换空格
    二维数组中的查找
    简单选择排序
    冒泡排序
    Hash表的实现
    二叉排序树
    ajax返回后台编译时都对,返回error
    sql删除重复的记录保留一条
  • 原文地址:https://www.cnblogs.com/skyh/p/12871571.html
Copyright © 2011-2022 走看看