• Solution Set 「AGC 010~012」C~F


    「AGC 010C」Cleaning

      Tag:「B.贪心」

      你不觉得我出的这道题要难一点嘛. (

      定义一个点的 "输出量" 为其需要的父亲向子树内走的路径条数. 叶子的输出量就是点权, 其他点的输出量可以直接唯一确定, 如果违背了一些条件自然就无解了.

    「AGC 010D」Decrementing

      Tag:「C.性质/结论」

      如果不除 \(\gcd\), 设 \(s=\sum a_i\), 则先手的获胜情况仅与 \(s-n\) 的奇偶性有关. 另一方面, 如果 \(2\nmid\gcd\), 这个除法也并不会改变 \(s\) 的奇偶性, 也就是不影响答案. 因此, 我们需要关注的是 \(\gcd\) 中因子 \(2\) 的情况.

      初步想一想策略: 若当前 \(s-n\) 下先手必胜, 那么先手疯狂操作偶数, 让 \(\gcd\) 永远不是 \(2\) 的倍数, 后手就寄了; 如果当前 \(s-n\) 下后手必胜, 并且先手无法一步让 \(2\mid\gcd\), 先手同理也寄了; 等等, 先手如果可以一步改变 \(\gcd\) 的奇偶性, 那么 \(a\) 中肯定有且仅有一个奇数且其 \(>1\). 先手只能操作它, 然后直接递归判断就好. 复杂度 \(\mathcal O(n\log a)\), 再算上暴力求 \(\gcd\) 的话就是 \(\mathcal O(n\log^2a)\).

    「AGC 010E」Rearranging

      Tag:「B.贪心」

      初步解读题意: Aoki 的操作会让序列成为满足从左到右拓扑关系下字典序最大的一个, 而 Takahashi 则要初始化这个序列. 当然啦, 我们肯定是直接构造结果序列, 相当于去规定具体的拓扑关系, 然后在这个拓扑关系下构造最大字典序序列.

      先考虑后者: 直接将拓扑排序过程中的队列换成关于权值的大根堆即可.

      前面这个 ... 根据 \(a_u\not\perp a_v\) 可以生成一系列无向边, 我们的工作是将它们定向, 形成一个 DAG. 其实也是一个贪心: 每次从未遍历过的点权最小的点出发, 按点权升序枚举邻接点递归, 构造生成树. 正确性容易感性理解.

    「AGC 010F」Tree Game ^

      20221003 C 题. 可算找到这傻瓜题的出处了. (

    「AGC 011C」Squared Graph *

      Tags:「C.性质/结论」「C.思维」

      兔, 根本不会分讨, 根本没有思维.

      考虑 \((x_1,y_1)\)\((x_2,y_2)\) 连通性, 我们需要尝试找到一条从 \((x_1,y_1)\) 走到 \((x_2,y_2)\) 的路径. 可见, 由于 \(((a,b),(c,d))\in E'\) 等价于 \((a,c),(b,d)\in E\), 所以从 \((a,b)\) 走到 \((c,d)\) 相当于让 \(a\) 沿着 \((a,c)\) 挪到 \(c\), 同时让 \(b\) 沿着 \((b,d)\) 走到 \(d\). 因此, \((x_1,y_1)\)\((x_2,y_2)\) 连通的条件是: 原图上存在一对等长的, 分别连接 \(x_1,x_2\)\(y_1,y_2\) 的路径. 稍作简化, 即存在两条长度奇偶性相同的简单路径.

      路径奇偶性的话 ... 肯定需要讨论连通块是否是二分子图嘛. 设 \(a,b,c\) 分别表示非二分图连通块数量, 二分图连通块数量 (不含单点), 单点数量. 讨论三种连通块内部和之间的连通情况即可计算答案. 复杂度 \(\mathcal O(n)\).

    「AGC 011D」Half Reflector *

      Tags:「C.性质/结论」「C.思维」

      看来这场 AGC 要爆零了 qwq.

      不妨讨论小球正在某两个 reflector 中间运动的情况, 用 \(\text{l/r}\) 标记运动方向那么

    • \(\text{ArA}\Rightarrow\text{AlB}\Rightarrow\text{BrB}\Rightarrow\text{BAr}\).
    • \(\text{ArB}\Rightarrow\text{AAr}\).

      发现一件事情: 若一个向右滚动的小球的左侧有 \(\text A\), 那么这个 \(\text A\) 会保持在球的左侧不断地向右移动. 因此, 在这种情况下小球一定会从最右侧离开. 换句话说:

    • 只要第一个 reflector 不是 \(\text A\), 小球一定会从右侧离开.

      当然, 第一个 reflector 就是 \(\text A\) 的情况太平凡了, 我们只去研究后者. 根据先前的结论, 小球左侧第一个 \(\text A\) 再左边的 reflector 的状态一定不会再因当前小球改变了. 况且, 在小球第一次出现在两个 reflector 中间时, 左侧的 reflector 一定是 \(\text A\) 状态. 所以我们就需要考虑上面列举的两种情况下, 左侧 reflector 的变化情况. 可见, 当右侧为 \(\text A\) 时, 左侧变为 \(\text B\); 当右侧为 \(\text B\) 时, 左侧变为 \(\text A\). 顺便结合边界情况的单独讨论, 我们可以得到一个简洁的结论:

    • 当第一个 reflector 不为 \(\text A\) 时, reflectors 的整体变化情况是: 全部取反, 然后循环左移一位.

      到此, 我们已经可以 \(\mathcal O(k)\) 地模拟整个变换过程了. 接下来的工作无非是找到变换的周期性特点. 注意在一次循环位移后, 最后一个 reflector 一定是 \(\text A\), 则下一次的倒数第二个一定是 \(\text B\), 再下一次倒数第三个又是 \(\text A\), ... ,每两个小球中至少有一个会引起位移, 那么最多 \(2n\) 个小球就能让序列恒定在 \(x(\text{AB})_k\) 的状态, 直接去求最终状态就好啦. 复杂度 \(\mathcal O(n)\).

    「AGC 011E」Increasing Numbers

      Tag:「B.Tricks」

      算是经典 trick 吧, 一个 increasing number \(x\) 可以表示成

    \[x=\sum_{i=1}^9\frac{10^{x_i}-1}{9}. \]

    \(N\)\(k\) 个 increasing numbers \(\{x_k\}\) 表示, 那么

    \[N=\sum_{i=1}^k\sum_{j=1}^9\frac{10^{x_{i,j}}-1}{9}\\ \Rightarrow 9N+9k=\sum_{i=1}^k\sum_{j=1}^910^{x_{i,j}}. \]

    由于 \(x_{i,j}\) 很随意, 所以只需要 \(9N+9k\) 在十进制下的位和不超过 \(9k\), 我们就能构造出合法解. 又显然 \(k\)\(\mathcal O(\log N)\) 的, 所以直接从 \(k=1\) 开始向上枚举 \(k\), 均摊 \(\mathcal O(1)\) 地维护 \(9N+9k\) 的值及其位和即可. 复杂度 \(\mathcal O(\log N)\).

    「AGC 011F」Train Service Planning *

      Tags:「A.数学-数学推导」「A.数据结构-线段树」

      一大难点是抽象出这个数学情景.

      令 \(p_i\) 表示 \(L\) 车 (\(0\to n\)) 在车站 \(i\) 停留的时间, \(q_i\) 表示 \(R\) 车 (\(n\to 0\)) 在车站 \(i\) 停留的时间. 同时, 记 \(S_a(t)=\sum_{i=1}^{t}a_i\), \(S_p(t)=\sum_{i=0}^{t-1}p_i\), \(S_q(t)=\sum_{i=0}^{t-1}q_i\). 那么, \(L\) 车行驶在区间 \((i-1,i)\) 的时间区间为

    \[(S_a(i-1)+S_p(i),S_a(i)+S_p(i))+tk. \]

    同理, \(R\) 车行驶在区间 \((i-1,i)\) 的时间区间为

    \[(-S_a(i)-S_q(i),-S_a(i-1)-S_q(i))+tk. \]

      对于 \(b_i=1\) 的区间, 我们要求

    \[((S_a(i-1)+S_p(i),S_a(i)+S_p(i))+t_1k)\cap((-S_a(i)-S_q(i),-S_a(i-1)-S_q(i))+t_2k)=\varnothing. \]

    注意两个区间是等长的, 所以有

    \[\begin{cases} S_a(i-1)+S_p(i) & \notin & (-S_a(i)-S_q(i),-S_a(i-1)-S_q(i))+tk, \\ S_a(i)+S_p(i) & \notin & (-S_a(i)-S_q(i),-S_a(i-1)-S_q(i))+tk. \end{cases} \]

      先整理一下, 令 \(x_i=S_p(i)+S_q(i)\), 则上式变为

    \[\begin{cases} S_a(i-1)+x_i & \notin & (-S_a(i),-S_a(i-1))+tk, \\ S_a(i)+x_i & \notin & (-S_a(i),-S_a(i-1))+tk. \end{cases} \]

    其中, \(\{x_{0..n}\}\) 是单调不降的. 也就是说, 从 \(x_i\to x_{i+1}\), 我们需要给出一个增量 \(d_i\ge0\), 使得 \(x_{i+1}\bmod k\) 不落在某些区间内. 显然, 为了最小化 \(x_n\), 若施加的 \(d_i\neq0\), 则 \(x_{i+1}\) 必然处于某个禁止区间的端点上. 用数据结构维护这一贪心过程即可. 复杂度 \(\mathcal O(n\log n)\).

    「AGC 012C」Tautonym Puzzle *

      Tag:「A.构造」


      一看就是倍增构造, 不过如何找到一个能够轻松 \(\times 2/+1\) 的东西捏?

      看了一眼题解, 啧, LIS 嘛. 在后面摆一个 \([1,2,\dots,100]\), 那么合法子序列总数就是前面部分的非空 LIS 数量了.

    「AGC 012D」Colorful Balls

      Tag:「A.并查集」


      欸不是, 真不觉得这题比上面那个构造简单嘛 ...

      有一个简单的暴力: 枚举 \(\binom{n}{2}\) 个交换关系, 并查集连边. 每个连通块对答案的贡献是一个多重组合数的形式, 可以直接算. 我们只需要简化一下建边的方式.

      对于同色交换, 可以简并为和同色中最轻的球的连续交换; 对于异色交换: 显然也应该两种颜色的最轻球先交换. 这里有一个 corner: 有可能某个球无法进行同色交换, 但可以通过最轻的异色球转移到同色最轻球位置, 我们直接认为它可以进行同色交换就好. 复杂度 \(\mathcal O(n\alpha(n))\).

    「AGC 012E」Camel and Oases

      Tags:「A.DP-状压/插头 DP」「B.倍增」


      我们一共有 \(c=\lfloor\log_2v\rfloor+1\) 次跳跃机会, 每次跳跃后必然可以覆盖掉相邻坐标差不超过 \(v'\) 的极长段. 换句话说, 我们需要选择 \(c\) 个分别满足相邻坐标差不超过 \(v,v/2,v/4,\dots,0\) 的连续段覆盖整个 \([1,n]\), 并且第一个连续段的位置是被钦定的.

      设第一个极长段覆盖了 \([l,r]\), 那么我们需要把剩下的可用极长段分为两个集合 \(S,T\), 用 \(S\) 内的极长段尝试覆盖 \([1,l-1]\), 用 \(T\) 内的极长段尝试覆盖 \([r+1,n]\). 注意这其实和 \(l,r\) 的取值没关系, 我们直接 DP 求出 \(f(S)\)\(g(T)\), 分别表示用 \(S\) 内的极长段从左侧开始能覆盖的最大右端点; 用 \(T\) 内的极长段从右侧开始能覆盖的最小左端点. 预处理一下倍增可以 \(\mathcal O(v\log v\log n)\) 求出来.

      然后呢? 如果暴力枚举 \(S\) 去检查 \(T\) 还是 \(\mathcal O(nv)\). 不过, 如果从左到右算答案, 可以覆盖到 \([1,l-1]\)\(S\) 将不断减少, 可以覆盖到 \([r+1,n]\)\(T\) 将不断增多. 所以我们暴力维护有哪些 \(S,T\) 满足当前条件, 统计 \(S\cup T=U\) 的数量. 当这一数量非零则有解. 最终复杂度 \(\mathcal O(v\log v\log n)\).

    「AGC 012F」Prefix Median *

      Tags:「A.DP-计数 DP」「C.思维」


      显然 \(b_n\) 为全局中位数, 这提示我们从后往前考虑 \(b\) 的构造可能会得到更强的限制. 从后往前, 每次可以删掉 \(a\) 的两个元素, 此时 \(b\) 在中出现位置的位移不超过 \(1\). 更细致的, 将 \(a\) 排序后, \(b\) 合法的条件为:

    • \(a_i\le b_i\le a_{2n-i}\);
    • \(\nexists i<j,~b_j<b_i<b_{j+1}\lor b_{j+1}<b_i<b_j\).

    通过构造方案, 可知这个条件是充要的. 接下来对它 DP 即可. 令 \(f(i,l,r)\) 表示从后往前考虑到 \(b_i\), 对于当前这个 \(b\), 左边可以直接移动到的位置有 \(l\) 个, 右边有 \(r\) 个. 当边界处出现相等数时视为同一个, 枚举下一个 \(b\) 移动到的位置就能完成转移. 复杂度 \(\mathcal O(n^4)\).

  • 相关阅读:
    CMD文件分析
    #ifdef __cplusplus
    nginx查看post请求日志
    JNI常见错误1
    include、include_once与require、require_once区别
    在Windows下利用Eclipse调试FFmpeg
    在Windows下利用MinGW编译FFmpeg
    图文详解YUV420, yuv格式2
    yuv rgb 像素格式1
    libyuv 编译for ios
  • 原文地址:https://www.cnblogs.com/rainybunny/p/16824979.html
Copyright © 2020-2023  润新知