zoukankan      html  css  js  c++  java
  • AGC004做题小记

    F补了两天……

    感觉真是太神仙了啊。

    D. Teleporter

    题意

    给定 $ n $ 个点,每个点走一步可以到达 $ a[n] $ ,你要修改最少的边,使得任何点走 $ K $ 步后都位于 $ 1 $ 号节点。一开始所有的点都可以到达 $ 1 $ 。

    $ 2 ≤ N ≤ 100000 $ , $ 1 ≤ K ≤ 1e9 $

    题解

    naive的贪心。

    可以发现 $ a[1] = 1 $

    如果 $ 1 $ 不指向 $ 1 $ , 那么 $ a[1] $ 到 $ 1 $ 距离为 $ K - 1 $ , 不符合题意。

    那么问题就变成,给定一颗有根树,根的深度是 $ 0 $ , 改变最少的边,使树的深度不超过 $ K $ 。

    $ dp[i] $ 表示 $ i $ 号节点挂下去的链长。

    如果 $ dp[i] = K - 1 $ , 且 $ 1 $ 和 $ i $ 没有边,那么就在 $ 1 $ 和 $ i $ 之间拉一条边。

    My Submission

    E. Salvage Robots

    题意

    给定一个 $ n * m $ 的网格图, 有一个出口, 若干格子上有机器人。你每次可以让所有的机器人全部向上、下、左、右中的一个方向走一格。走到出口的机器人会获救,走出网格的机器人会爆炸。问最多获救的机器人个数。

    $ 2 ≤ n , m ≤ 100 $ 。

    题解

    做过 ARC101F 就会简单不少。

    $ dp[U][D][L][R] $ 表示向上、下、左、右走过历史最大步数为U、D、L、R时拯救的最多机器人。

    $ O(n ^ 4) $ DP即可。

    因为调不出来和网上代码手动diff了一发

    My Submission

    F. Namori

    题意

    给定一张 $ n $ 个点 $ m $ 条边的连通图,所有点初始为白色。每次可以选择两个同色相邻点,将他们颜色同时翻转。问将所有点变为黑色的最小步数。无解输出(-1)

    $ N ≤ 100000 $ , $ M ≤ N $

    题解

    一棵树的情况

    树一定是二分图。如果将树黑白染色会发生什么呢。

    原问题就变为了:给定一棵树,深度为奇数的点为黑色,深度为偶数的点为白色,每次可以交换两个异色点,要使原先为黑色的点变白,原先为白色的点变黑,求最小步数。

    无解的条件显然是黑白点数不同。

    计算答案时,有下面的结论:

    在最优策略下,我们记一个点与它父亲进行交换的次数为 $ f(x) $ , 以 $ x $ 为根的子树黑白点数差值为 $ S(x) $ , 则 $ f(x) = abs(S(x)) $ 。

    简要给出证明:易知 $ abs(S(x)) $ 是 $ f(x) $ 的下界。而下面的构造说明 $ f(x) $ 可以等于 $ abs(S(x)) $ 。

    每次选取一个点,使得它的颜色不等于它父亲的颜色,且它的子树需要它父亲的颜色,然后交换这个点和它的父亲。直到不能交换就到达了目标状态。

    然后我们证明在没有达到目标状态时一定存在符合条件的点:

    假设现在不存在符合上述条件的点。因为没有达到目标状态,一定可以找出一个子树内需要白点的黑点和一个子树内需要黑点的白点。

    不妨设这个黑点为 $ x $ , 那么它的父亲一定也是黑点,同时它的兄弟节点要么是黑点,要么不需要黑点。从而它的父亲也是一个子树内需要白点的黑点。以此可以推出 $ x $ 到根的路径都是子树内需要白点的黑点。同理又有白点到根的路径都是子树内需要黑点的白点。这样就产生了矛盾。因此假设不成立,一定存在符合上述条件的点。

    从而答案就是 $ sum_{i = 1}^{n} abs(S(i)) $ 。 $ O(n) $ 计算即可。

    环长为偶数的情况

    不在环上的点按树的情况处理。环上的点则是要输出一定量的黑点或输入一定量的黑点,这就是HAOI2008 糖果传递

    我们设节点 $ u $ 需要输出的黑点数为 $ a_u $ ,如果是需要输入则 $ a_u $ 为负数,它向环上下一个节点输出的黑点数为 $ x_u $ ,如果是接收则为负数。

    我们要最小化 $ sum_{i = 1}^{cyclelen} abs(x_u) $

    同时我们又有 $ a_i - x_i + x_{i - 1} = 0 $ ,这样得到 $ cyclelen $ 条方程,其中只有 $ cyclelen - 1 $ 条线性无关。从而我们可以把所有未知量表示为 $ x_i = x_1 + del_i $ 的形式。

    从而我们就要最小化 $ sum_{i = 1}^{cyclelen} abs(x_1 + del_i) $

    然后转化为直线上若干点到一个点的最小距离和。取中位数即可。

    环长为奇数的情况

    这种情况最复杂,但是也最优美。

    这时是在一个二分图的一侧连了一条边。我们需要修改模型来使这条边符合模型。

    当操作这条边时,它的影响不是交换两个点的颜色,而是将两个同色点反色。

    我们用另一种语言表述树的情况。

    原问题:一张图分为X部和Y部,初始都为白色,每次可以选择一条边,将两个点的颜色同时取反。条件是两点同色。目标是让所有点反色。

    模型转化后:一张图分为X部和Y部,初始X部为黑色,Y部为白色。每次可以选择一条边,将两个点颜色同时取反。条件是两点异色。目标是让所有点反色。

    两个问题似乎有很强的对偶性质!

    再用这样的语言表述奇数长度环的情况。

    原问题:一张图分为X部和Y部,初始都为白色,每次可以选择一条边,将两个点的颜色同时取反。条件是两点同色。目标是让所有点反色。

    模型转化后:一张图分为X部和Y部,初始X部为黑色,Y部为白色。每次可以选择一条边,将两个点颜色同时取反。如果他们是同部点,条件是两点同色;如果他们是异部点,条件是两点异色。目标是让所有点反色。

    假设两个点的初始颜色分别为 $ a_1 $ , $ a_2 $ , 当前颜色分别为 $ b_1 $ , $ b_2 $ , 那么对一条边操作的本质是在满足 $ a_1 xor a_2 = b_1 xor b_2 $ 的条件下将两点颜色取反。

    所以任何点一开始染成任何颜色都是没有关系的。只要在符合边操作的情况下将所有点颜色取反即可。

    既然如此,将基环树看做二分图一侧加一条边。无解的条件是X部和Y部点个数的奇偶性不同。

    因为最终黑白点个数是确定的,所以这条边的操作次数也是固定的。我们将这条边操作一定次数之后断掉这条边,然后按树的情况处理即可。

    My Submission

  • 相关阅读:
    LeetCode 258 Add Digits
    LeetCode 231 Power of Two
    LeetCode 28 Implement strStr()
    LeetCode 26 Remove Duplicates from Sorted Array
    LeetCode 21 Merge Two Sorted Lists
    LeetCode 20 Valid Parentheses
    图形处理函数库 ImageTTFBBox
    php一些函数
    func_get_arg(),func_get_args()和func_num_args()的用法
    人生不是故事,人生是世故,摸爬滚打才不会辜负功名尘土
  • 原文地址:https://www.cnblogs.com/Vexoben/p/11729316.html
Copyright © 2011-2022 走看看