UNR#2 选做
UOJ NOI Round #2 Day1
【UNR #2】UOJ拯救计划
设恰好用 \(i\) 个颜色的染色方案为 \(f_i\),那么我们知道答案可以表示成:\(\sum_{i=1}^k\dbinom{k}{i}\times i!\times f_i\),然后由于我们只要计算 \(\%6\) 的值,不难发现 \(\dbinom{k}{i}\times i!\) 在 \(i>2\) 时均为 \(0\),因此我们只需要求出 \(i=1\) 和 \(i=2\) 的答案即可。两种情况都比较显然,对于第二种判一下二分图即可。
【UNR #2】排兵布阵
先考虑只有 \(1356\) 怎么做,可以直接 \(kdt\),但是 \(kdt\) 显然不能支持什么给横坐标为 \(x\) 的值加上 \(p\) 之类的阴间操作,于是就有了一个神仙做法:
假设每一列的关键点数量为 \(d_x\),每一行为 \(d_y\),把每个关键点想象成一条 \(x\to y\) 的边,如果 \(d_x>d_y\) 则连边 \(y\to x\),否则连边 \(x\to y\),根据三元环计数的结论,我们知道每个点出度不会超过 \(\sqrt{N}\)。
对于一个关键点,如果他所代表的边是 \(x\to y\) 的,则称这个点是第 \(x\) 列的关键点,否则称这个点是第 \(y\) 行的关键点,那么每行每列的关键点数量都是 \(\sqrt{N}\) 级别的。于是我们的主要思路就是关键点暴力,非关键点打标记。(实际上没太懂具体怎么操作的,就咕了)
【UNR #2】黎明前的巧克力
我们考虑也就是要求出一个集合,使它异或和为\(0\),然后这个集合的贡献就是\(2^{size}\)
由于每个数只能选一次,不难发现我们最后的结果就是将\((1+2\times x^{a_i})\)用\(\rm xor\)卷积乘在一起,最后\(x^0\)上的系数也就是我们的答案。
如果直接将这些级数直接暴力卷在一起,复杂度是\(O(NMlogM)\),其中\(M=max(a_i)\),考虑怎么优化这个过程。
我们发现,对于任意的\(a_i\),我们将\((1+2\times x^{a_i})\)取\(FWT_{xor}\)操作之后,得到的点值只有两种权值。
证明:我们知道,\(FWT\)的定义式实际上是\(FWT_i=\sum_{j=0}^Mc(i, j)\times f(j)\)。
我们知道异或卷积的矩阵只有两者都为\(1\)的时候才有\(-1\)的贡献,否则贡献为\(1\)。所以我们可以将定义式改写成:\(FWT_i=\sum_{j=0}^M(-1)^{count(i\&j)}\times f(j)\)。
考虑到\(f(j)\)只有在\(0, a_i\)处有取值,又由于\(0\)处\((-1)^{count(i\&j)}\)一定为\(1\),所以我们的权值只有可能是\(1+2\)或者\(1-2\),也就是只有可能是\(3, -1\)。
所以,我们将原\(FWT\)的所有点值乘起来之后,每个系数都会变成\((-1)^x\times 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\times (-1)+(n-x)\times 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\) 个区间,那么则有转移:
复杂度 \(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\ne 1\) 的情况,就是有些位置取到了 \(b^x\),这些数其他位是不能随便取的,只要知道数量就可以了。于是新加一维表示数量即可,复杂度 \(O(m^3b^2)\)。
【UNR #2】解开尘封的仪式
提答题,咕了。