zoukankan      html  css  js  c++  java
  • CF1326F2

    题意

    cf

    做法

    (f_S)为原状态为(S)的答案
    (g_S=sumlimits_{Ssubseteq T} f_T)

    我们求({g_S}),最后(O(n^22^n))子集反演回({f_S})

    考虑(g_S)的意义,即为钦定一些大小固定的链,然后随意拼接起来
    比如(11010100),是钦定大小为({3,2,2,1,1})的链
    对于钦定的集合相同的(S_1,S_2)(g_{S_1}=g_{S_2})
    故本质不同的状态为(O(P(n)))(P(n))(n)的拆分方案数)

    (h_{S})为集合(S)的链个数(哈密顿路径个数),可以简单(O(n^22^n))求得
    对于一种拆分方案,我们要做的是子集卷积,不过这样复杂度是(O(P(n)cdot ncdot n^22^n))

    我们可以将拆分数的搜索建出一棵搜索树,然后节点与节点之间的转移用子集卷积,最后再叶子节点即可得到答案

    具体讲下细节
    一般在搜索拆分数时,我们习惯从小到大搜数,这样会导致许多无效搜索
    为了方便代码的实现,我们从大到小搜数,这样均为有效搜索

    时间复杂度(O(P(n)2^n+n^22^n))

  • 相关阅读:
    [HDU 2089]不要62
    [WC 2011]Xor
    [BJOI 2011]元素
    [NOIp 2014]解方程
    [UVa 1326]Jurassic Remains
    [BZOJ 2152]聪聪可可
    [IOI 2011]Race
    [测试题]打地鼠
    [POJ 2828]Buy Tickets
    [测试题]gene
  • 原文地址:https://www.cnblogs.com/Grice/p/14173352.html
Copyright © 2011-2022 走看看