zoukankan      html  css  js  c++  java
  • 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))

  • 相关阅读:
    7.内网渗透之windows认证机制
    10.Python之Ansible自动化运维常用模块
    9.python 系统批量运维管理器之Fabric模块
    8.python 系统批量运维管理器之pexpect模块
    7.python实现高效端口扫描器之nmap模块
    6.python探测Web服务质量方法之pycurl模块
    5.python之pip安装模块失败
    4.python 系统批量运维管理器之paramiko模块
    3.python 发送邮件之smtplib模块
    微慕WordPress小程序增强版
  • 原文地址:https://www.cnblogs.com/dqsssss/p/11147845.html
Copyright © 2011-2022 走看看