zoukankan      html  css  js  c++  java
  • Helvetic Coding Contest 2019 差A3 C3 D2 X1 X2

    Helvetic Coding Contest 2019

    A2

    题意:给一个长度为 n 的01序列 y。认为 k 合法当且仅当存在一个长度为 n 的01序列 x,使得 x 异或 x 循环右移 k 位的 01 串得到 y 。问合法的 k 的个数。 (n le 2*10^5)

    key:找规律

    考虑如何check一个 k 是否合法。那么对于所有的 i 和 i-k 在模 n 的意义下,如果 y 的第 i 位为 0 则二者必须不同,否则必须相同。这样可以用并查集判断是否合法。实际上是把相同的缩起来后看看是否存在奇环。

    仔细观察可以发现实际上只有 i+k*m 这个集合中的点有边,并且形成了一个环,而环的大小就是集合中 1 的个数。

    实际上,对于一个 k ,只需要把 1~n 按照模 gcd(k,n) 分成等价类,判断每个等价类中 1 的个数即可。所以只需要对 n 的每个约数做预处理。复杂度 (O(nsqrt n))

    B2

    题意:给一个带权二分图,边权均为 k 。可以加若干个右部点连向所有左部点,边权为 h。求二分图最小权匹配。 (n le 1000)

    key:二分图

    实际上只有两种情况:全部匹配,花费为 n*h。或者不加新点,花费为匹配数*k。证明比较显然。写这个题主要是当时傻逼了……

    E1

    题意:给一个带权无向图。定义 (E_{max}(c_i)) 是把第 i 条边的边权最大修改成多大,使得它可能出现在最小生成树中。求 (E_{max}(c_1))(n le 10^5)

    key:最小生成树

    有一个易证的结论:若某边可以出现在最小生成树中,那么把严格小于该边边权的所有边加入图中,该边的两个端点仍然处于两个联通块中。

    E2

    题意:对于所有非树边,求上题中的 (E_{max}(c_i))。保证最小生成树唯一。 (n le 10^5)

    key:最小生成树

    因为最小生成树唯一,所以还是有一个易证的结论:一条非树边的答案为对应最小生成树的链上最大值。

    E3

    题意:对于所有边,求上题中的 (E_{max}(c_i))(n le 10^5)

    key:最小生成树

    首先先看非树边,考虑E2的做法以及它为什么在不唯一时仍然成立:对于做出来的一棵最小生成树,非树边的答案显然是大于等于链上最大值的。如果存在一个最小生成树的形态使得在这条链上的最大值更大,那么显然可以把这条边换掉来得到一个更小权的生成树,矛盾。实际上这表明对于最小生成树的任意形态,两点之间的最大值是不变的(NOIP2013 货车运输)

    对于树边其实比较简单:如果在生成树上把这条边去掉,会分成两个联通块,考虑所有连接这两个联通块的边,除去它本身最大的那条边即为答案。换句话说,所有覆盖它的非树边中最小的即为答案。这可以用并查集简单的维护。

  • 相关阅读:
    初识react hooks
    react初识生命周期
    在调用setState之后发生了什么
    课后作业四
    课后作业2
    课后作业1
    自我介绍
    电脑软件推荐
    数据结构
    数组(一维数组)
  • 原文地址:https://www.cnblogs.com/dqsssss/p/11179272.html
Copyright © 2011-2022 走看看