一些题(十三)

[IOI2013] wombats

对每一行维护一个 \(C\times C\) 的矩阵,表示这一行的每一个点到下一行每一个点的最短路,于是就可以用线段树维护所有矩阵的 \((\min,+)\) 乘法来 \(O(C^3\log R)\) 修改和 \(O(1)\) 回答询问。注意到两条最优路径不会相交否则可以调整,于是矩阵乘法可以利用决策单调性做到 \(O(C^2)\) 进而可以 \(O(C^2\log R)\) 修改,时间上可以接受。但由于空间限制,需要对线段树上比较小的区间暴力计算,以节省空间。

https://www.luogu.com.cn/record/70350514

[JOI 2013 Final] 冒泡排序

首先发现交换的两个位置一定是前缀最大值和后缀最小值,然后发现交换后变化的逆序对数满足四边形不等式,于是直接利用决策单调性分治算即可,计算贡献时可以维护指针移动然后树状数组统计,时间复杂度 \(O(n\log^2n)\)

https://loj.ac/s/1395426

[ARC134E] Modulo Nim

打个表可以发现后手必胜的情况除了 \(\{1\},\{2\},\{4,8\}\) 外剩下的每种情况的每个数都是 \(12\) 的倍数,证明可以考虑讨论 \(m=2,3,4\) 的操作。然后发现 \(200\) 以内 \(12\) 的倍数很少,可以直接状压求出哪些是后手必胜态,后面计数部分就简单了。

[ICPC2020 WF] What’s Our Vector, Victor?

首先用第一个超球的方程减去剩下的超球的方程,可以得到 \(n-1\) 个线性方程组,用高斯消元后能解出一个无限延申的超立方体。接着可以通过拉格朗日乘数法解出超立方体上离第一个超球的球心最近的点,然后从这个点往任意一个方向沿着超立方体走直到它到球心的距离等于半径长度,走的距离可以二分。

https://www.luogu.com.cn/record/70414787

[EZEC-11] Tyres

考虑把每个轮胎换胎的时间加到第一圈上,然后发现当圈数 \(\ge O(\sqrt{t})\) 时每一圈的时间都是单调的且都比前面的长。于是可以对前面做背包,后面直接贪心,然后再合并两个部分。时间复杂度 \(O(n^2t+m\log n)\)

[EZEC-11] 雪的魔法

摆了,直接贴官方题解。值得一提的是转化后的问题也相当于在一个类似网格图的图上做最长路,可以每次沿着长宽中较短的那一维切开分治,时间复杂度也能做到 \(O(n\sqrt{n})\)

https://www.luogu.com.cn/record/70554955

[PA2021] Desant 2

和上面那题几乎一模一样。

https://qoj.ac/submission/21404

[CF468E] Permanent

考虑将 \(A_{x,y}\ne 1\) 的位置拆成 \(A_{x,y}-1\)\(1\),那么就相当于一张二分图,有 \(k\)\((x,y,A_{x,y}-1)\) 的边,求每一组大小为 \(r\) 的匹配的边权乘积再乘上 \((n-r)!\) 之和。可以队每个连通块分别考虑,若一个连通块的点数为 \(V\),边数为 \(E\):那么一种方法是状压一侧的点是否被匹配,时间复杂度 \(O(V^22^{V/2})\);或者找一棵生成树,枚举非树边的匹配状态,然后树上 dp 树边,时间复杂度 \(O(V^22^{E-V+1})\)。平衡一下,时间复杂度 \(O(k^22^{k/2})\)

[AGC003E] Sequential operations on Sequence

倒着考虑,假设现在要求 \(i\) 次操作后前 \(x\) 项中每个数的出现次数,如果 \(x\le q_i\),那么可以直接递归到 \(i-1\)。否则就可以把 \(x\) 拆成 \(\lfloor x/q_i\rfloor\)\(q_i\) 的段和剩下长为 \(x\bmod q_i\) 段,然后递归到 \(i-1\) 去求。最后可以后缀和统计答案。由于每次拆的时候 \(x\) 会取模,所以只会拆 \(\log x\) 次,于是总共的所求询问的个数至多 \(O(n\log q_i)\) 个。可以用 map 每次找到需要拆的 \(x\),时间复杂度 \(O(n\log q_i\log n)\)

https://atcoder.jp/contests/agc003/submissions/29823438

[CF889E] Mod Mod Mod

设状态表示只考虑 \(a_1,\ldots,a_i\) 最后剩下 \(x\) 的最大值为 \(ix+f_x\)。然后转移和上面那题差不多,只不过改为从前往后做,每次拆的时候只用保留最大的整段和那个剩下的段即可。

https://codeforces.com/contest/889/submission/148182046

[CF1322E] Median Mountain Range

考虑 01 序列怎么做,发现对于每一个 01 交错的段,会在长度除二次操作后变为全 0 或全 1 或一半 0 一半 1,而原本的 0/1 连续段不会变。回到原问题,对于每个 \(x\),将 \(a_i\le x\) 的位置设为 0,否则设为 1。那么稳定的次数就是所有 \(x\) 对应的 01 序列稳定次数中的最大值,一个位置稳定后的值就是最大的 \(x\) 使得对应 01 序列稳定后那个位置上为 0。由于 \(x\) 从小到大枚举时 01 交错段的变化数量是 \(O(1)\) 的,容易用数据结构维护变化的段以及答案。

posted @ 2022-03-06 14:00  Y25t  阅读(185)  评论(0编辑  收藏  举报