• Codeforces Round #572 (Div. 1) 差E


    Codeforces Round #572 (Div. 1)

    A2

    题意:给一棵树,带边权,互不相同且为偶数。每次操作是选两个叶子然后在路径上同时加一个数。初始边权全是0,求一个操作序列使得最终边权与给定边权相同。 (n le 1000) ,构造的序列长度不超过 (10^5)

    key:构造

    首先,如果有二度点,那么一定无解。

    所以现在每个点要不是叶子,要不就至少是三度。考虑一条边,我们只把它的边权改变,而不改变其他边。此时需要讨论这条边两段的点的度数。

    如果两个点都是大于等于三度的,那么可以在一端中找到两个叶子,使得它俩的lca就是这个点。由于边权都是偶数,设其为2k,那么只需 add(a1,b1,k), add(a2,b2,k), add(a1,a2,-k), add(b1,b2,-k) 即可。其他情况同理

    C

    题意:给一个序列 (b_i) ,定义一个序列的 beauty 为 (min_{1le i<jle n}|a_i-a_j|) 。求 (b_i) 中所有长度恰好为 k 的子序列的 beauty 之和。 (k le n le 1000, b_i le 10^5)

    key:dp

    首先排序,然后考虑枚举beauty。可以发现 i 的转移是一个前缀和,并且随 i 单调不降,所以有一个O(n*k) 的dp。

    其实真正有用的beauty不多,至多是 (frac{10^5}{k-1}) ,所以复杂度是 (O(10^5*n))

    D

    题意:给出 n 个数,每次操作是给一个数加上一个2的幂。求最少多少次操作使得整个序列的数字相同。 (n le 10^5, a_i le 10^{17})

    key:二进制,dp

    显然最后全都相同的那个数至少是给定序列的最大值。并且 x 变成 y 所用的操作次数是 y-x 中二进制 1 的个数。

    所以首先用最大值减去所有的数字得到新序列 (b_i) ,问题变成:给 (b_i) 加上一个数 t,使得所有数字的二进制中 1 的个数之和最小。

    考虑 dp :只需要记录当前位的进位情况就能转移。但这样的状态空间是 (2^n) ,然而实际情况是远远小于的。

    进位发生时,当且仅当 (t \% 2^k+b_i\%2^k ge 2^k) 。所以如果对 (b_i) 按后 k 位二进制大小排序,那么只可能是一个后缀在进位。所以状态空间变成 O(n)

    所以每次转移时,只需要枚举进位情况,然后枚举当前是0还是1,计算进位数。这个进位数一定是下一个状态的后缀,所以直接转移即可。如果排序用计数排序实现,那么复杂度是 (O(62*n))

  • 相关阅读:
    EOJ2032 判断两个数是否相等
    EOJ2529 强大的lwc
    EOJ 1199 Anagram
    EOJ2530 数字之和
    EOJ2941 在线投票系统
    EOJ2124 Seamild的电梯
    EOJ 1027 邮资的问题
    通过js导入js,通过js导入css
    无意间在我系统中发现的一张图~~~~~
    css系列看过之后让我~~~
  • 原文地址:https://www.cnblogs.com/dqsssss/p/11147845.html
Copyright © 2020-2023  润新知