zoukankan      html  css  js  c++  java
  • Atcoder ARC-125

    写的详细的就是我不会做的。。。

    A

    显然至多有一次移动距离 (> 1) 只需判断这个位置在哪里即可。

    复杂度 (mathcal{O}(n))

    B

    (x ^ 2 - y = z ^ 2 Longrightarrow y = (x + z)(x - z))

    考虑枚举 (y) 计算合法的 (x) 的数目,不难发现 (x) 合法的充要条件为:

    [egin{cases} y = ab(a ge b)\ a + b equiv 0 pmod{2} end{cases} ]

    有两种做法:

    做法一

    观察到 (b le a le sqrt{n}),于是考虑枚举 (b),转化为统计合法 ((a, b)) 的数量。

    那么显然合法的 (a) 的数目可以直接计算得出,复杂度 (mathcal{O}(sqrt{n}))

    做法二

    首先直接忽略 (b le a) 这个条件,只需计算出此时答案与 (a = b) 时的答案即可。

    后者的数量显然为 (lfloor sqrt{n} floor),考虑如何计算前者。

    考虑枚举 (a) 的大小,发现统计的式子可以整除分块,复杂度 (mathcal{O}(sqrt{n}))

    C

    考虑按位贪心,问题在于如何判定是否存在解。

    首先容易发现对于任意的排列和给定的任意序列均存在一种构造方式能满足其有解:

    我们找到 (> A_1) 的那些元素将其从大到小放在 (A_1) 之前,然后紧跟着恰好按照 (A) 序列的顺序放置,然后再把 (< A) 的部分倒序放在最后,容易观察得到这一定是合法的。

    由于这是对于排列的判断,因此现在我们就需要找到一种方式使得填完前面的数字后后面的问题为一个子问题。

    首先我们有观察(不难证明):

    • 第一个数字 (P_1 ge A_1)

    为了字典序最小,我们大胆猜测是否可以选到 (A_1)

    答案是肯定的,因为去除掉 (A_1) 后剩下的部分我们可以按照原问题的做法得到一个满足要求的解。

    但是去掉 (A_1) 之后的部分不一定要求 ( m LIS) 一定恰好为 (|A| - 1),因为 (A_1) 不是 (1)

    但我们发现此时 (1) 可以紧接着填在序列的第二个位置,证明方法同 (A_1) 放置。

    那么此时就必须保证第 (3) 个位置开始之后的子串 ( m LIS) 必为 (|A| - 1),又 (A_1) 不为 (1),因此这就是一个 (|A'| = |A| - 1, n' = n - 2) 的子问题。

    于是我们可以考虑递归解决,可以直接循环实现,维护一个当前最小值位置的指针即可,复杂度 (mathcal{O}(n))

    D

    考虑动态维护每个前缀局面每个位置结尾的合法串数量,不妨假设当前考虑到 ([1, s]) 这个局面,(f_i) 为以 (i) 结尾的合法串数量。

    容易发现对于以一种元素结尾的合法串必定只能出现在 ([1, s]) 中最后一个出现的位置。

    考虑如何扩展这个局面:记 (l_i)(i) 左侧与其元素权值相同的第一个位置,有转移:

    [f_i = sumlimits_{j = l_i} ^ {i - 1} f_j + [l_i = 0] ]

    然后发现仅需将 (f_{l_i}) 清空即可,使用树状数组维护,复杂度 (mathcal{O}(n log n))

    E

    不难建出网络流模型,考虑最大流转最小割,枚举每种边删去哪个集合,于是问题转化为:

    给定三个序列 (A, B, C),最小化:

    [minlimits_{S subseteq U_1, T subseteq U_2} A(S) + C(T) + (n - |S|)B(U_2 - T) ]

    显然 (|S|) 确定的时候一定选择最小的 (|S|) 个元素最优,于是将序列按照 (A) 排序,等价于求:

    [minlimits_{0 le i le n, T subseteq U_2} sumlimits_{j = 1} ^ i A_j + C(T) + (n - i)B(U_2 - T) ]

    此时有观察:(T) 集合内的元素选择是独立的,考虑将元素 (x)(T) 中替换到 (U_2 - T) 当中,变化量为:(-c_x + (n - i)b_x) 我们希望其变小: (-c_x + (n - i)b_x le 0 Longleftrightarrow frac{c_x}{b_x} ge n - i),于是问题转换为求:

    [minlimits_{0 le i le n} sumlimits_{j = 1} ^ i A_j + sumlimits_{frac{c_j}{b_j} le n - i} c_j + (n - i)sumlimits_{frac{c_j}{b_j} > n - i}b_j ]

    排序后显然随 (i) 增合法的 (j) 有单调性,双指针维护,复杂度 (mathcal{O}(n log n))

    F

    首先不难得到一个暴力的做法:令 (f_{i, j, k}) 为考虑完前 (i) 个节点,当前选出了 (j) 个节点,当前选出节点的度数总和为 (k) 是否合法,直接转移复杂度 (mathcal{O}(n ^ 3))

    接下来貌似没有方法继续优化了?根据以往的经验,对于判定型的 ( m dp),优化方法除了基本 ( m dp) 优化方法以外,还有:压位转移和分析可行解的断点数量很少(通常表现为一段区间)。

    我们对样例打表观察到 ((x, y)) 的断点貌似挺多,于是可以考虑换一个量进行打表:((x, y - x)) 我们惊奇地发现当 (y - x) 固定的时候可行的 (x) 真的是一段区间!

    考虑尝试证明一下这个结论:为了尽可能拟合上述的结论,我们先令 (v_i = d_i - 1) 那么这个时候的权值和就是原本的 (y - x)

    与此同时,由于 ((x, y))((x, y - x)) 构成双射(下面称 ((x, y - x)) 这样的点对为 ((x, s))),因此令 (v_i = d_i - 1) 后的问题与原问题的答案一致。

    此时我们再来分析 (s) 固定时 (x) 的最小值 (L(s)) 与最大值 (R(s))

    继续观察可以发现:(L(s)) 当中一定没有选任何一个 (v = 0) 的点,否则一定可以将点数减少;同理 (R(s)) 内一定将所有 (v = 0) 的点都选上了。

    因此我们可以知道 ((L(s), s) sim (L(s) + z, s), (R(s) - z, s) sim (R(s), s)) 一定都是合法的。

    接下来我们有如下观察:

    • 对于选定的任意的集合 (S),令 (f(S)) 为其权值和,(z)(v)(0) 的元素个数,那么都有:

    [-z le f(S) - |S| le z - 2 ]

    右侧的原因是:(f(S) - |S| le sumlimits_{i in S, v_i > 0} v_i - |S| le sumlimits_{v_i > 0} v_i - 1 = n - 2 - (n - z) = z - 2)

    根据上述的性质,不难发现:(R(s) - L(s) = R(s) - s - (L(s) - s) le 2z - 2)

    又我们有第一个区间右端点和第二个区间左端点之差:

    [L(z) + z - R(s) + z ge 2z - (2z - 2) ge 2 ]

    这两个区间一定相交且易知包含 ([L(s), R(s)]) 内的每个元素,因此原命题成立。

    此时我们仅需求出权值为 (s) 时最少(多)选出的点数即可。

    直接做复杂度是 (mathcal{O}(n ^ 2)) 的,但观察到 (sum v_i = n - 2) 因此本质不同的 (v) 仅有 (sqrt{n}) 种,于是我们采用单调队列优化多重背包,复杂度 (mathcal{O}(nsqrt{n}))

    GO!
  • 相关阅读:
    Python正课38 —— 有参装饰器
    Python正课37 —— 无参装饰器
    Python正课36 —— 闭包函数
    Python正课35 —— 函数对象与函数嵌套
    Python正课34 —— Global与Nonlocal
    Python正课33 —— 名称空间 与 作用域 介绍
    vue中wowjs的使用
    js得到时间戳(10位数)
    腾讯地图使用中,出现了“鉴权失败,请传入正确的key”
    js数组操作大全
  • 原文地址:https://www.cnblogs.com/Go7338395/p/15253009.html
Copyright © 2011-2022 走看看