zoukankan      html  css  js  c++  java
  • 杂题20200407

    Connecting Cities

    给定 (n) 个点和一个常数 (D) ,第 (i) 个点权值为 (a_i) ,点 (i, j) 之间有一条边权为 (|i-j| imes D+a_i+a_j) 的边,求这张完全图的 MST 权值

    • (nleq2 imes10^5)
    • (D, a_iin[1, 10^9])

    我会 Boruvka 直接莽, (O(nlog^2n))

    考虑分治,假设当前处理到了区间 ([l, r]) ,可以发现 ([l, mid])([mid+1, r]) 之间的某些边是不会被用到的,只用建出 区间 ([l, mid])(A_{pos}-pos imes D) 最小的 (pos)([mid+1, r]) 中每一个点的边;区间 ([mid+1, r])(A_{pos}+pos imes D) 最小的 (pos)([l, mid]) 中每一个点的边

    一共会建出 (O(nlog n)) 条边,暴力求最小生成树,时间复杂度 (O(nlog ^2n))

    还有一种线性的神仙做法,鸽了


    GCJ 2018 Round 1B Task2 Mysterious Road Signs

    给定三个长为 (n) 的序列 (A, B, D) ,其中 (D) 单调递增

    定义一段区间 ([l, r]) 合法,当且仅当 (exist (M, N), forall lleq ileq r, D_i+A_i=M)(D_i-B_i=N) 成立

    求出合法区间的最长长度,与最长的合法区间个数

    • (nleq10^5)
    • (A_i, B_i, D_iin[1, 10^6])

    做法一:

    分治,对于区间 ([l, r]) ,求出 (mid, mid+1) 对应的 (M, N) ,往左 / 往右找到第一个不满足 (M) / (N) 限制的位置,讨论四种情况即可, (O(nlog n))

    做法二:

    (f(i, j, k)) 为 以 (i) 结尾,限制条件中的 (M=j, N=k) 时,最长的合法区间长度

    有用的状态数显然是线性的

    转移可以考虑记一个 (g1(i, j)) 表示限制条件中的 (M=j, N=-1) 时,最长的合法区间长度; (g2(i, k)) 表示限制条件中的 (M=-1, N=k) 时,最长的合法区间长度

    现在 (f(i, j, k)) 就可以从 (f(g1(i, j)-1), f(g2(i, k)-1)) 转移,时空复杂度 (O(n))


    CF444C DZY Loves Colors

    给定一个序列,初始 (a_i=i) ,每个位置的权值为 (0) ,有 (q) 次操作:

    1. 将区间 ([l, r]) 赋值为 (x) ,如果第 (i) 个位置被赋值为 (x) ,第 (i) 个位置的权值会增加 (|a_i-x|)
    2. 询问区间 ([l, r]) 的权值和

    (n, qleq10^5)

    结论:序列的颜色段数量在 (q) 次操作中总共只会有 (O(n+2q))

    因此在线段树上,对于区间颜色相同的点直接打 tag,否则暴力递归


    CF808G Anthem of Berland

    给定两个串 (s, t)(s) 包含小写字母和问号, (t) 仅包含小写字母

    (s) 中的每个问号变成一个小写字母(共 (26^{cnt}) 种方案),求出所有方案中, (t) 匹配 (s) 子串的次数的最大值

    (|s|, |t|leq10^5; |s|cdot|t|leq10^7)

    做法一:

    (f_{i, j}) 为走到 (s) 的第 (i) 位,匹配了 (t) 的前 (j) 个字符,当前答案的最大值

    对于 (s_i= ?) ,暴力枚举 (26) 种字符,使用 kmp 转移

    做法二:

    (f_i) 为走到 (s) 的第 (i) 位,当前答案的最大值

    可以枚举是否在 (i) 处匹配一个 (t) 转移,由于最优解 (t) 的所有匹配位置可能有交,因此要枚举 (t) 的所有 next,但是这并不能保证 (s) 对应位置等于 (t) 的某一个前缀,因此需要保证在上一段 (s) 的末尾放了一个 (t)

    因此记 (g_i) 为强制在 (s) 的第 (i) 位匹配一个 (t) ,当前答案的最大值,即可转移


    CF1327D Infinite Path

    给定一个长为 (n) 的排列 (p) ,和一个颜色序列 (c_i)

    定义两个排列 (p, q) 的乘积为 ({p_{q_i}})

    找到最小的正整数 (k) ,令 (q=p^k) ,存在 (i) 满足 (c_i=c_{q_i}=c_{q_{q_i}}=cdots)

    (displaystylesum nleq2 imes10^5)

    结论1:将 ((i, p_i)) 连边,对于 (p) 中的所有环,在新图内从这个环的第 (i) 个点向第 (i+k) 个点连边,构成了 (p^k) 的图

    结论2:令 (p) 中的某一个环环长为 (sz) ,则这个环在 (p^k) 中构成的环与 (p^{gcd(k, sz)}) 中构成的环元素相同

    题目即为找一个 (k) 使得 (p^k) 存在一个颜色相同的环,由于结论2,对于 (p) 中的一个环,枚举 (sz) 的所有因数 (k) ,考虑这个环在 (p^k) 中的构成,判断是否满足条件,时间复杂度 (O(nsqrt n))

  • 相关阅读:
    RGB颜色原理
    JVM内存模型 三
    JVM内存模型 二
    从gcc局部static变量初始化看C/C++区别
    linux下进程堆栈下溢出判断及扩展实现
    fd/pid选择及fd/signal数量限制
    多进程/线程select同一文件问题
    从两个程序看Linux下命令行参数及execve内核实现
    从printXX看tty设备(6)tty框架及串口O_NONBLOCK何时丢失数据
    文件在多大程度、多大范围共享
  • 原文地址:https://www.cnblogs.com/Juanzhang/p/12651505.html
Copyright © 2011-2022 走看看