zoukankan      html  css  js  c++  java
  • ABC220H

    考虑折半,将点按照标号是否 (le frac{n}{2}) 分成两个集合 (S_1, S_2)

    首先原问题的形式有点奇怪,我们不妨统计没有被覆盖覆盖的边为偶数条的情况。

    这样一来问题转化为白点 导出子图 的边数为偶数的情况,这与原问题等价。

    考虑 (S_1, S_2) 中怎样的两个集合合并是合法的,形式化地,有:

    (f_S(S subseteq S_1))(S) 这个集合导出子图边数的奇偶性,类似地定义 (g_T(T subseteq S_2)),同时令 (E_{S, T}(S subseteq S_1, T subseteq S_2)) 为左部集合 (S) 到右部集合 (T) 的边数奇偶性,那么 (S, T) 合并合法当且仅当:

    [f_S oplus E_{S, T} oplus g_T = 0 ]

    直接这样判定很没有前途,因为 (E) 的总量已经达到了 (2 ^ n) 级别,因此考虑转移判定方式。

    (p_S(S subseteq S_1))(S_2) 中与 (S) 连边为奇数的点构成的点集,那么判定条件可以改写为:

    [f_S oplus ((p_S & T) & 1) oplus g_T = 0 ]

    注意到中间部分很特殊,于是我们考虑固定中间部分,统计:

    [h_Q = sumlimits_{p_S & T = Q} f_S oplus g_T ]

    即可 (mathcal{O}(2 ^ {n / 2})) 计算答案。

    注意到上式形式与与卷积非常类似,考虑将其转化为与卷积的形式。

    枚举 (f_S = pf, g_T = pg),令 (vf_Q = sumlimits_{p_S = Q} [f_S = pf], vg_Q = [g_Q = pg]),那么有 (f_S = pf, g_T = pg) 时对 (h) 的贡献:

    [h_Q = sumlimits_{S & T = Q} vf_S imes vg_T ]

    直接做与卷积即可,复杂度 (mathcal{O}(n2 ^ {n / 2}))

    GO!
  • 相关阅读:
    scala学习之特质(trait)
    Android 使用finalBitmap实现缓存读取
    Android ActionBar以及menu的代码设置样式
    Android获取窗体信息的Util方法
    RelativeLayout用到的一些重要的属性:
    [转] Git SSH Key 生成步骤
    正则表达式
    面向对象
    数组
    顺序结构,循环结构
  • 原文地址:https://www.cnblogs.com/Go7338395/p/15363646.html
Copyright © 2011-2022 走看看