zoukankan      html  css  js  c++  java
  • CF Round #669 Div2

    A

    可以发现不论往怎样一个串往后加上两个 (0) 或两个 (1) 其奇数位和偶数位上的差值都是相同的。因此我们两位两位考虑这个 (01) 串,对于相邻两位相同那么直接留下,否则留下 (0) 即可。

    B

    每轮直接贪心找一个能使得当前 (gcd) 最大的数往后填即可。

    C

    为了能找到每个数的取值,我们的第一想法就是找到 (p_i = n) 的位置,然后用剩下的数去依次模 (p_i) 即可。但你会发现这个 (p_i = n) 的位置是很难找到的,但上面这个过程给予了我们提示:对于排列中任意两个数 (p_i, p_j(p_i < p_j))(p_i \% p_j = p_i, p_j \% p_i < p_i)。因此,每次我们查询两个位置 (p_i \% p_j, p_j \% p_i) 则其中小的哪个数一定为 (p_i),但 (p_j) 的值并不确定,因此我们还需记录下 (p_j) 等待后面的查询。于是我们可以从左到右扫过来,假设当前扫到了 (i) 号位置,记录 (1 sim i - 1) 中最大元素的位置 (j),每次查询 (p_i \% p_j, p_j \% p_i) 即可。最后留下来的哪个数一定最大为 (n)。这样的查询次数不超过 (2n)

    D

    首先可以注意到一个 (dp),令 (dp_i) 表示跳到 (i) 的最小步数,那么有朴素的转移:

    [dp_i = min(dp_i, dp_j + 1)(max(a_{i + 1}, cdots, a_{j - 1}) < min(a_i, a_j)) ]

    [dp_i = min(dp_i, dp_j + 1)(min(a_{i + 1}, cdots, a_{j - 1}) < max(a_i, a_j)) ]

    首先观察一下第一条转移,你会发现这个转移的条件是非常有特色的。也就是说对于每个 (i),其能转移到的 (j) 要满足 (j + 1 sim i - 1) 中不存在位置大于等于 (a_i, a_j)。换句话而言,也就是 (j) 右侧第一个不小于其的位置要不小于 (i),并且 (j) 也要不小于在 (i) 左边第一个不小于其的位置。但这样的限制还是很空泛,依然不能有效加速这个过程。仔细分析一下你会发现,如果 (i)(j) 右侧第一个不小于 (a_j) 的位置左侧,那么一定有 (a_i < a_j),显然 (i) 左侧第一个比他大的位置一定就是 (j);反过来另一种情况就一定可以推得 (j) 右侧第一个不小于其的位置一定为 (i)。这样转移的次数就会被大大减少了,可以发现能转移到 (i) 的位置 (j),就是 (j)(i) 左侧第一个比他大的位置或 (j) 右侧第一个不小于这个位置的位置为 (i) 的这些 (j)。显然上述两个位置可以在单调栈时求出,并且对于第二条转移方程有类似的转移,于是本题就在 (O(n)) 的时间复杂度内被解决了。

    E

    直接按照每条边去确定每个点填的颜色显然是很难做的,因为我们不知道这个点对后面有什么影响,因此需要换一个方向考虑。

    我们可以发现 (n) 号点不能被到达需要关注于 (i ightarrow n) 的所有点 (i)。一个直接的想法是如果 (i ightarrow n) 的边权只有 (w) 那么我们一定要把 (i) 号点设置为 (!w) 会更优。实际上这个想法是正确的,因为:

    不论之前到 (i) 号点的边怎么选择,都只有到达 (i) 号点和不到达两种情况。如果 (i) 号点不可到达,显然选择什么都无所谓;如果 (i) 号点可到达,那么如果不选 (!w) 就一定会到达 (n) 了,但选择 (!w) 还又可能到不了 (n),因此选 (!w) 会更优。

    于此同时你会发现如果 (i ightarrow n) 的边权 (0 / 1) 都有,那么同样利用上面哪个分析过程你会发现选择 (0 / 1) 都是无所谓的,因为不论选择什么都能到达 (n)

    接下来我们需要从 (n) 连到的边回到整张图,你会发现上面的过程给了我们很大的提示去将这张图的所有边反向,那么我们接下来将这张图反向过来看。你会发现假如当前还是有一些点能到达 (n),那么如果我们要使这些点都不能到达,显然选择先后考虑的顺序是不会影响结果的。退一步讲,如果存在其中一些点是怎样都可以到达的,那么我们的任务是需要最大化整张图的最短路。那么我们肯定要贪心地让最短路最小点能到达的边断掉,否则经过这个点点必然可以变为最短路。并且由于先后考虑的顺序不会产生影响,因此我们直接贪心选取当前最短路最小的点出来让它所连的边能断则断,再将不能断的点加入当前考虑的范畴即可。因为边权大小都是 (1) 的,于是我们直接使用 (bfs) 实现即可。时间复杂度 (O(n + m))

    GO!
  • 相关阅读:
    Big-data:Linux基础(04)--快捷键
    Big-data:Linux基础(03)
    Big-data:Linux基础(02)
    [mysql]删除和修改
    git使用两个异常处理
    jmeter函数使用以及json格式的后置处理器
    jmeter遇到中文不可见
    jmeter参数化
    GIT简易使用
    mysql基本语句(更新中)
  • 原文地址:https://www.cnblogs.com/Go7338395/p/13680797.html
Copyright © 2011-2022 走看看