UNR #7 补题

发布时间 2023-08-06 20:22:07作者: Rainbow_qwq

意识流题解。

那些你不要的

场上写了一个二分答案 + 栈模拟,实在是太蠢了!

观察到每次一定会删一个奇数位的和一个偶数位的,最后只有一个奇数位的会保留下来,然后就完了。

比特迷宫

场上写了一个乱搞:每 \(24\) 个分一块,对于每块跑出一个最优解。然后把相差 \(2^k\) 的相同操作不断合并。

这样在随机数据下比较优秀,但不能过 hack. 加了 1000 次随机打乱,结果有一个 Hack 超了 300 次。

实际上应该可以构造到小于 \(160000\) 量级的?但是我不会.


官方题解的确定性做法:

将所有状态 \(S\) 按 popcount 从高到低处理。

核心观察:如果 flip 了 \(S\) 位置,那么设 \(T\)\(S\) 去掉某一个 1 位(\(S\ \text{and}\ T = T\)),那么翻转一下 \(S\) 可以同时翻转任意若干个的 \(T\)

实现上只需要把 \(S\) 的若干个 \(1\) 去掉得到 \(A\),执行 \((A,S-A)\) 即可。

\(S\ \text{and}\ T = T\)\(S\) 能覆盖 \(T\).

那么问题可以转化为,对于 popcount \(=k\) 的所有 \(S\),选取一个覆盖集,使得能覆盖所有 popcount \(=k-1\) 的所有 \(T\)

接下来贪心搞一搞,就可以得到总数为 \(157884\) 的覆盖集。

璀璨宝石

80 分做法:

考虑把答案表示成 \(\max(A,B,C,D,E,\lceil sum/2 \rceil)\),这也是第一直觉的想法。

枚举某一个颜色作为最大值,可以求出 \(A/B/C/D/E\) 作为最大值的方案。

但是怎么求 \(\lceil sum/2 \rceil\) 能否取到最大值呢,可以转成计数,数出 \(sum\) 的总方案数减去 \(A/B/C/D/E\) 作为最大值的方案数,如果方案数 \(>0\) 就可行。

这样可以做到 \(O(n^2M^2)\).


考虑看作一个匹配问题,每次匹配两个球,而不是考虑 \(\max(mx,\lfloor sum/2 \rfloor)\)。(我觉得这一步实在太难想到了!)

考虑将问题划分成两个阶段。

第一阶段是把每次加进来的任意选两个消除;

第二阶段是钦定一种颜色 \(c\) 是之后最大的,每次都把新加进来的颜色和 \(c\) 消除,其他颜色不互相消除。

这样就有了自由操作的空间:我们可以在任意时间从第一阶段转换到第二阶段,对于所有这样的方案取 \(\min\)。(如果转换时间选错是不优的,但是在 dp 的时候可以任意时间转换,所以可以取到最优。感觉很妙!)

对于第一阶段,只需要记录当前剩下的颜色 \(c\)\(c\) 多余的个数。

对于第二阶段,只需要记录当前钦定的颜色 \(c\)\(c\) 多余的个数,如果是其他颜色多余则看作是负数个 \(c\)

这样状态数就是 \(O(nM)\) 的了,并且第一种的多余 \(x\) 个可以和第二种的多余 \(x\) 个记在同一个状态里,所以状态数只有 \(f([0..4],[-M..M])\)

暴力转移可以做到 \(O(n^2M^2)\),利用单调队列优化第一种转移,可以做到 \(O(n^2M)\)

火星式选拔

为什么空间只开 512MB!!!

反重:求熵

太难了,我觉得这种题是不是初见杀,没见过这种题就做不出来。做的时候知道这是暴力解除限制的题,却一点也没有高分的想法。

赛时想法:

考虑一个一个消去变量。猜一个结论,对于第一个变量 \(a_1\),值域可以分成若干段,\(a_1\) 取某一段值的时候,后面的答案是一个关于 \(a_1\) 的多项式,可以插值出来。然后不断二分下一段插值的端点。

但是这样做太劣了,只能跑 \(n\le 3\)

正解也考虑了”一个一个变量消去,解除限制“,但是更加显式地把限制表示出来。

先钦定 \(n+1\) 号变量为 \(0\),加入限制 \(a_i\ge a_{n+1},a_i\le a_{n+1}+T\).

\(1\)\(n\) 一个个消去变量。

考虑如果 \(2\)\(n\) 都确定了,那 \(1\) 一定会受到左、右的限制,也就是会有一个 \([l_1,r_1]\)

此时,后面的每个变量都对 \(1\) 变量产生一个 \([l_j,r_j]\) 的限制,那最后 \(l_1=\max(l_j),r_1=\min(r_j)\)

将贡献差分,变成 \(r_1 - (l_1 - 1)\)。考虑枚举某个端点(左/右),被后面的哪个变量限制得最强。也就是 \(\max,\min\) 是在哪个值取到的。这样共有 \(n!2^n\) 种枚举。

由于钦定了某个 \(j\)\(i\) 限制最强,在 \([2,n]\) 之间会形成一些新的限制,在 dfs 枚举的时候顺便加入。

容易发现限制会形成一个树的结构,连边 \(i\to fa_i\)\(n+1\) 是树的根。

这时转化成了这样的问题:要求 \(0\le a_i\le a_{fa_i}+w_i\),求所有方案数.

每个点维护一个多项式 \(f_i(x)\) 表示根节点权值取 \(x\) 时子树内方案数为 \(f_i(x)\)

在树上从下向上转移,令 \(F_i(x) = \sum_{j=0}^{x+w_i} f_i(j)\),转移就是 每次把 \(F_i(x)\) 乘到 \(f_{fa_i}(x)\) 上。

由于 \(F_i\) 的项数恰好比 \(f_i\)\(1\),转移复杂度就是树形背包,为 \(n^2\).

于是总复杂度 \(O(n!2^n n^2)\)

终于补完了所有 zky 场切的题

鸽子收费站

需要支持这样的操作:将 \([l_1, r_1]\) 中值在 \([l_2, r_2]\) 的元素全部置为 \(r_2\)

这题居然能做到 polylog 的,很厉害。

考虑 Segment Tree Beats 式维护,在线段树上做,如果区间中有 \(\ge 2\) 个要被修改的值就递归,否则修改这个值。

在根节点上维护一棵平衡树,表示所有值去重后的结果。

对于线段树每个子节点维护一棵平衡树,每个节点连向线段树父亲节点种平衡树的对应节点。

考虑修改时,