zoukankan      html  css  js  c++  java
  • CF1444

    CF1444

    CF1444A

    给定 (t) 组查询,每次给定 (p,q),求最大的 (x) 使得 (x|p,q ot |~x)

    (tle 50,ple 10^{18},qle 10^9)

    Solution

    考虑质因数分解 (q)(q ot | ~x) 相当于存在某个质因子满足其次幂严格小于 (q),那么其余质因子显然都不需要处理,枚举质因子即可,复杂度 (mathcal O(tsqrt{q}))


    CF1444B

    题意很复杂

    link

    Solution

    一开始读错题了,这道题做了蛮久,看懂题后一下子就过了。

    考虑按照值域排序,然后枚举第 (x) 个元素在 (p) 组的排名为 (i),那么 (x) 之后需要有 (n-i) 元素也选入 (p),于是 (q) 内被选的元素会有 (2n-x-(n-i)) 个。

    (x) 贡献为正当且仅当 (q) 内元素排名在它前面,等价于 (ige (n-x+i) o xge n)

    于是贡献无关于具体排名,只和位置相关,那么可以直接算答案了。


    CF1444C

    给定一张图 (n) 个点 (m) 条边,每个点有一个颜色,操作为选择两个颜色并保留这两个颜色的所有点并以此生成子图,求多少种方案使得这张图为二分图。

    Solution

    枚举颜色对子 ((u,v)) 条件等价于仅保留 (u) 内边,(v) 内边,(u o v) 边他是二分图。

    非法的情况一定是存在边连接了 ((u,v)) 了,那么这类对子至多只有 (m) 对,直接枚举对子加边然后 check 二分图减掉即可。

    复杂度的问题在于 (u) 这个颜色内部的边会反复加,用并查集维护加入内部边后的图,然后加入外部边,做完一次后撤销即可。

    答案为 (inom{k}{2}-[非法对子])(k) 为合法的颜色数。


    CF1444D

    题意很复杂

    简要题意:

    给出若干条线段的长度,每条线段的方向(竖直/水平)。

    要求把他们拼在一起构成:

    • 封闭图形。
    • 每条竖直线段的下一条是水平线段。
    • 不存在线段在端点处之外相交。

    (nle 1000,l_ile 1000)

    Solution

    有解的必要条件是:

    • 竖直和水平线段的数量相同。
    • 可以将竖直线段和水平线段分别分成两个集合使得权值和相同。

    然后手玩一下,会发现,满足这两个条件好像总是合法的...

    大概可以使用调整法使得方式变成一定合法。

    可以大胆猜测 (然而我考场上并不敢写) 满足这两个条件就是合法的。

    同时,可以发现任意的分集合都是对的 .....

    考虑使用 dp 来分集合,这个玩意儿是简单的 bitset 优化背包(NOI D2T1)

    于是只需要考虑构造方案:

    可以考虑贪心构造(建议手玩,其实还有一个结论,就是可以调整成这类凸型结构,当然我都不会证),将边分成四类:

    • 水平往右 ((R))
    • 水平往左 ((L))
    • 竖直向上 ((U))
    • 竖直向下 ((D))

    然后我们将 (UR) 分在一组,将 (LD) 分在一组,然后不难发现以任意方向为开头都是等价的,所以这样构造:

    • (R) 从大到小排序,将 (U) 从小到大排序,然后依次放。
    • 另一边,将 (D) 从大到小排序,将 (L) 从小到大排序,依次放(也从起点(类似于反过来放))。

    然后两类会存在多的部分,这些多的部分直接按顺序任意放都是合法的。

    • 为了除去这类多余的,或者说保证只有一类情况,建议强制令 (|R|>|L|,|U|>|D|)

    复杂度 (mathcal O(frac{n^3}{omega}))

    话说不写 bitset 复杂度也是真的...因为 (h=wle 500(frac{1000}{2}))


    CF1444E [* interesting]

    交互题,树上有一个特殊节点 (u),你每次可以查询一条边以确定两个端点那个端点离 (u) 更近。

    你需要在最劣情况最优的条件下确定 (u) 的位置,即查询次数不超过 (t)(t) 为最优的最劣情况的查询次数)。

    (u) 的位置由交互器动态构造。

    (nle 100)

    Solution

    直观的构造是每次删重边,然而这不一定是最优的。

    答案的上界是 (n-1) 的,在菊花树的时候取到。

    可以构造不同的图以获得不同的上界,这道题似乎没有啥简单明了或者说直接的构造方案。

    考虑转换问题,每次删除一条边,得到两个连通块递归。

    每次删除一条边我们就给这条边的权值加 (1),然后对两个连通块内的所有边做相同的处理,然后断开此边。

    对于某种固定的删除方案,我们可以将边按照此过程赋权,此时最大的边权就是我们的操作次数。

    此时这棵树会满足:

    • 任意两条权值相同的边之间存在一条边权值小于它。

    考虑反转权值(设最大值为 (k),所有边权变成 (k-x+1)),现在条件为:

    • 任意两条权值相同的边之间存在一条边权值小于它。(且所有边权均为正数)

    观察:假设存在一棵树满足此限制,那么可以一定可以构造方案,即每次选边权最大的边删除即可,此时操作次数不会超过 (max e_w)

    所以这个限制相当于对原问题的弱化,同时最优解与原问题相同(目标均为最小化最大边权)。

    于是问题变成给一棵树每条边赋权,满足相同的权值之间存在一个权值小于它。

    考虑以递归处理此问题,不妨假设子树 (u) 已经满足限制,不难发现我们只需要考虑从 (u) 转移到父亲 ( m father) 对答案计算的影响,此时我们添加了一条新边 (u o m father),同时可以影响答案的边为所有满足此边到 (u) 的路径上不存在比它大的权值的边。

    根据权值将这些边抽象为一些二进制数(某些权值存在/不存在),不难发现我们希望从 (x) 处传出来的二进制数尽可能小(或者说更大的一定是不优的)(那么分配边权等价于确定一个二进制数满足其大于原权值)。

    此时我们需要确定所有可以走到 (x) 处的边权,我们等价于给每条边分配权值以消去其部分元素,最后使得这些权值不存在某一位出现两次。

    • 形式化的说,问题相当于,给定 (deg (x)) 个数 (c_i),你需要确定一组 (b_i) 满足 (b_i>c_i) 且满足 (b_1~&~b_2...~& ~b_{deg(x)}=0),然后令 (b_x=b_1|b_2|b_3...|b_{deg(x)}),我们需要最小化 (b_x)

    由于是二进制数,那么当然可以逐位确定,我们从前往后确定每个位能否放 (0),这样的话不妨先设后面的位全部为 (1),这样我们的目标是检查一个答案。

    检查一个答案可以直接贪心:

    从前往后枚举每个位,对于一个 (1),存在且仅存在两种操作:

    1. 集合内存在一个 (1),此 (1) 用于抵消对应 (1) 的作用。
    2. 集合内不存在此位为 (1),此 (1) 可以消去集合内最大的数。
    3. 存在多个 (1),非法。

    于是我们只需要维护集合内的最大值,每次消去最大值之后检查一下次大值是否为 (1) 即可(注意 (0) 也可以加入集合,删除的情况仅有第二类操作)

    使用优先队列可以在 (mathcal O(nlog n)) 的复杂度解决此问题。(存储似乎需要一些技巧,可以使用双关键字啥的,更高的位似乎比较麻烦)

    我们需要确定 (n^2) 次位,因此整体复杂度可以做到 (mathcal O(n^3log n))

    tips:似乎可以优化到 (mathcal O(n^2log n)),但是我不会。

    完成边染色的问题之后,策略就是 naive 的选择权值最大的边并删去了。

    tips:当然,你也可以写得极端丑陋,然后复杂度变成 (mathcal O(n^4log n))(为啥也过了...)


  • 相关阅读:
    设计模式课程 设计模式精讲 14-3 组合模式源码解析
    设计模式课程 设计模式精讲 14-2 组合模式coding
    设计模式课程 设计模式精讲 14-1 组合模式讲解
    设计模式课程 设计模式精讲 13-3 享元模式源码解析
    设计模式课程 设计模式精讲 13-2 享元模式coding
    设计模式课程 设计模式精讲 13-1 享元模式讲解
    设计模式课程 设计模式精讲 12-3 适配器模式源码解析
    设计模式课程 设计模式精讲 12-2 适配器模式coding
    设计模式课程 设计模式精讲 11-3 装饰者模式源码解析
    12个很少被人知道的CSS事实
  • 原文地址:https://www.cnblogs.com/Soulist/p/13922433.html
Copyright © 2011-2022 走看看