• UNR#2 选做


    UOJ NOI Round #2 Day1

    【UNR #2】UOJ拯救计划

    设恰好用 (i) 个颜色的染色方案为 (f_i),那么我们知道答案可以表示成:(sum_{i=1}^kdbinom{k}{i} imes i! imes f_i),然后由于我们只要计算 (\%6) 的值,不难发现 (dbinom{k}{i} imes i!)(i>2) 时均为 (0),因此我们只需要求出 (i=1)(i=2) 的答案即可。两种情况都比较显然,对于第二种判一下二分图即可。

    【UNR #2】排兵布阵

    先考虑只有 (1356) 怎么做,可以直接 (kdt),但是 (kdt) 显然不能支持什么给横坐标为 (x) 的值加上 (p) 之类的阴间操作,于是就有了一个神仙做法:

    假设每一列的关键点数量为 (d_x),每一行为 (d_y),把每个关键点想象成一条 (x o y) 的边,如果 (d_x>d_y) 则连边 (y o x),否则连边 (x o y),根据三元环计数的结论,我们知道每个点出度不会超过 (sqrt{N})

    对于一个关键点,如果他所代表的边是 (x o y) 的,则称这个点是第 (x) 列的关键点,否则称这个点是第 (y) 行的关键点,那么每行每列的关键点数量都是 (sqrt{N}) 级别的。于是我们的主要思路就是关键点暴力,非关键点打标记。(实际上没太懂具体怎么操作的,就咕了)

    【UNR #2】黎明前的巧克力

    我们考虑也就是要求出一个集合,使它异或和为(0),然后这个集合的贡献就是(2^{size})

    由于每个数只能选一次,不难发现我们最后的结果就是将((1+2 imes x^{a_i}))( m xor)卷积乘在一起,最后(x^0)上的系数也就是我们的答案。

    如果直接将这些级数直接暴力卷在一起,复杂度是(O(NMlogM)),其中(M=max(a_i)),考虑怎么优化这个过程。

    我们发现,对于任意的(a_i),我们将((1+2 imes x^{a_i}))(FWT_{xor})操作之后,得到的点值只有两种权值。

    证明:我们知道,(FWT)的定义式实际上是(FWT_i=sum_{j=0}^Mc(i, j) imes f(j))

    我们知道异或卷积的矩阵只有两者都为(1)的时候才有(-1)的贡献,否则贡献为(1)。所以我们可以将定义式改写成:(FWT_i=sum_{j=0}^M(-1)^{count(i&j)} imes f(j))

    考虑到(f(j))只有在(0, a_i)处有取值,又由于(0)((-1)^{count(i&j)})一定为(1),所以我们的权值只有可能是(1+2)或者(1-2),也就是只有可能是(3, -1)

    所以,我们将原(FWT)的所有点值乘起来之后,每个系数都会变成((-1)^x imes 3^{n-x}),只需要在对其进行一次(IFWT)操作即可。

    考虑到(FWT)实际上是一个线性变换,满足(sum FWT(F(x))=FWT(sum F(x)))。我们可以用一次操作求出(FWT(sum F(x))),也就是我们可以很方便的得到(sum FWT(F(x)))。考虑到我们要求出的(sum FWT(F(x)))的点值实际上是(x imes (-1)+(n-x) imes 3),发现这是一个一元一次方程,于是我们就可以求出(x),从而求出(prod FWT(F(x)))

    UOJ NOI Round #2 Day2

    【UNR #2】积劳成疾

    假设整个序列的最大值在位置 (p),那么会有若干个区间的答案为 (p),然后抛开这些区间,剩余部分会变成两个独立的部分,这已经提示我们采用区间 (dp) 来解决问题。

    (f_{i, j}) 表示长度为 (i) 的区间,劳累度最大值恰好为 (j) 的所有方案的乘积之和,(s_{i, j})(f_{i, j}) 的前缀和。那么枚举最大值的出现位置 (k),假设最大值可以覆盖 (x) 个区间,那么则有转移:

    [f_{i, j}=sum_{k=1}^iw_j^c imes s_{k-1, j-1} imes s_{i-k, j} ]

    复杂度 (O(N^3))

    【UNR #2】梦中的题面

    先考虑 (c=1) 的情况,将 (n) 拆分成 (b) 进制数,从小到大考虑每一位,对于第 (x) 小的位置,有 (m-x+1) 个数可以任意填,其余 (x) 位只能填 (0)。先设 (f_{i, j}) 表示有 (i) 个数,取值范围在 ([0, b-1]),相加和为 (j) 的方案数,这个可以通过简单 (dp) 算出。

    再设 (dp_{i, j}) 表示考虑到第 (i) 位,前 (i) 小位进了多少位。其中,如果前 (i) 小位填入的值大于 (n),那么再算进一位。然后直接 (dp) 即可(也可以加一维 (0/1) 达到同样的效果)。

    对于 (c e 1) 的情况,就是有些位置取到了 (b^x),这些数其他位是不能随便取的,只要知道数量就可以了。于是新加一维表示数量即可,复杂度 (O(m^3b^2))

    【UNR #2】解开尘封的仪式

    提答题,咕了。

  • 相关阅读:
    <![CDATA[文本内容]]>
    Java对于表达式中的自动类型提升
    oracle循环语句
    Recastnavigation 创建 off-mesh link 的潜规则
    CritterAI 翻译 Configuration Parameters
    ndk-build 修改输出so位置 (change ndk-build output so lib file path )
    C# List<> Find相关接口学习
    C++ sizeof(struct) 的注意
    Unity使用Resources读取Resources路径下的二进制文件(Binary Data)必须使用 .bytes扩展名
    C++ ifstream ofstream 注意事项
  • 原文地址:https://www.cnblogs.com/bcoier/p/14867514.html
Copyright © 2020-2023  润新知