LOJ 乱做:Born this way Right!

全是智商题!

增加效率,一些简单的没什么 trick 或者需要总结的题就不写得事无巨细了。

P10350 [PA2024] Modernizacja Bajtocji

Link

P3953 [NOIP2017 提高组] 逛公园

神仙恶心题。。

使用一个显然的分层图 dp 过了 \(60\)。有两个问题:\(0\) 权边怎么办?复杂度多了一只 \(\log\) 怎么办?

考虑这个分层图 dp 是不是没什么架在 dij 上的必要,毕竟只需要数数就行了。一看确实是,但是拓扑序非常混乱。所以我们把它改成记忆化搜索。改倒是挺好改的,就是需要注意 \(1\) 是可以反复经过的,所以一开始只能对 \((1,0)\) 这一种状态进行赋初值。

改完就能顺利过 \(70\) 了,考虑怎么做带 \(0\) 权的。

其实 \(0\) 权边本身对我们的 dp 没有什么影响。恶心的是 \(0\) 环,如果走到了 \(0\) 环上那么记忆化搜索就会卡死,不过加一个在记忆化搜索路途中判环的操作就行。很明显,能被搜到就保证一定存在一种方案可以走到。

注意精细实现,不然会被万恶的 UOJ 网友卡爆。

P5283 [十二省联考 2019] 异或粽子

大型 trick 合集。

首先用 prefix xor 容易转成维护 \(sum\),求 \(sum_l\oplus sum_r\) 的前 \(k\) 大,其中 \(l<r\)

求两两第 \(k\) 大或小这个东西很经典,我今天才会,称之为 trick from merging。具体来说,如果有两个对于某种运算而言单调不降的数组 \(a,b\),求 \(a_i\)\(b_j\) 运算后前 \(k\) 小,那就让 \(a\) 数组中每个数先初始化指针在 \(1\),把所有 \(a_i\)\(b_1\) 的运算结果扔进堆里面。每次就弹出堆顶,并把对应 \(a_i\) 的指针后移一位,加入新的 \(a_i\)\(b_{poi}\) 的运算结果。因为对于这种运算是单调不降的,所以这是对的。

当然即便不是单调不降也无所谓。只要你能找到对于 \(a_i\) 下一个最小的 \(b\) 也行。

这启发我们应用在异或粽子上。首先我们先取消限制,把 \(l<r\) 改成随便 \(l,r\),由于 \(a_l\oplus a_r=a_r\oplus a_l\)\(a_l\oplus a_l=0\),所以只需要把前 \(k\) 大改成前 \(2k\) 大求和除以二就行了。这个 trick 好像叫上三角补全。

然后对于每个数先求出所有数里面和它异或的第 \(1\) 大,扔进堆里。按照 trick from merging 的操作,每次都要查所有数异或一个数的第 \(k\) 大,这是经典的。

还有需要可持久化 trie 的做法和加强版。

可持久化 Trie 做法 咕了。
加强版做法 复杂度里面没有 $k$ 了。

首先应用上三角补全,然后考虑现在怎么求前 \(k\) 大的和,然后发现你又不会了。考虑要求前 \(k\) 大的和至少要求出第 \(k\) 大,这可以用二分轻松做到 \(\mathcal O(n\log^2 w)\)。具体来说,枚举 \(a_i\) 和下界,把所有数塞进 Trie 里面逐位钦定就行了。

能不能再快一点? 可以。

参考 ABC252Ex,我们取消二分直接数。考虑直接从高到低枚举最终答案的每一位,考察这一位是否能是 \(1\)(具体来说就是加上贡献是不是还小于 \(k\)),并把所有数全部摁在 Trie 树上同时走。如果可以是 \(1\) 的话,先垒答案,就在每个点上都累加这一位异或出来是 \(0\) 造成的贡献(这容易用 Trie 上子树和做到),然后往自己这位的反方向走(继续保持高位相同);当然否则的话就直接往这位的同方向走。

算是一个很有技巧性的东西吧。

然后考虑求两两数对里面小于这个第 \(k\) 大的和。考虑枚举其中一个数然后到 Trie 上走,用 Trie 上二分的方法,还是钦定最高几位异或出来都相同,那么我们要垒答案时就需要求一个子树里面所有数和给定数的异或的和。显然必须再次拆位不然没办法求和,对于每一位都要加上异或出来是 \(1\) 的数量乘这一位的贡献就行了。

注意第 \(k\) 大这个数需要单独处理一下。

有一个技巧让我们可以不用在 Trie 上扫一遍垒子树和。对原数组排序后建立的 Trie 中,任何一个子树内包含的元素都是一个区间,所以可以直接垒前缀和。

JOISC2018H Bitaro's Party

注意到总询问点数有保证,可以考虑根号分治。

对于较大的部分,不会询问超过根号次,所以暴力。对于较小的部分,可以在所有点上维护,toposort 时归并即可。

P5304 [GXOI/GZOI2019] 旅行者

想到了如果能算出抵达一个点的最近关键点和从它出发的最近关键点之后就好做了,当然有一些起点终点重合的 case 要判断,不过可以多维护几个次大之类的东西。

主要是卡在了忘记多源 Dij 这回事。

P7840 「C.E.L.U-03」重构

注意到总度数不变,考虑调整法。当然我不会证明取劣解之后会更劣。

CF1682E Unordered Swaps

在置换环上刻画操作之后事情就很简单了。在置换环上给操作两点连边,想到了必须是先做外面的再做里面被包含的边,但是对于方向有一定没想清楚。按照正常环的顺序连之后进行拓扑排序其实就行了。一直在考虑按照长度排序怎么做。

P9963 [THUPC 2024 初赛] 前缀和

利用 \(p_i\) 表示前缀和中 \(i\) 出现的期望次数(其实就是其出现的概率),可以用期望可加性得到一个式子。观察到二项式定理的形式,然后就完了。

没观察出来。

P6626 [省选联考 2020 B 卷] 消息传递

一眼淀粉质,但是要考虑怎么转成数路径,再利用“必须经过分治中心的路径数量”这个玩意来算贡献。很明显这就是要数长度为 \(k\) 的路径的数量,随便垒一下就行了。

注意点分治只有统计大规模路径的功能。

P4516 [JSOI2018] 潜入行动

综合性树形背包。

首先,想题时认为复杂度是 \(\mathcal O(nk^2)\) 的一直不敢写,事实上,对于这种后面附加一维关于子树内信息的树形背包(比如什么子树内有 \(j\) 个这种显然不会大于子树大小的信息),合并时只要可以对两坨 siz\(\min\) 循环转移,复杂度是 \(\mathcal O(nk)\) 的。证明懒得看了,但是下次对于树形背包一定要记得大胆写,说不定是对的呢。

其次,树形 dp 转移的时候可以用同个点的不同状态之间转移,实现钦定子树满足什么条件的功能。比如这里可以钦定某个儿子子树的根被选从而扭转该点子树的被覆盖状态。这个没想起来。

调题时在转移顺序上出现了很大的纰漏。首先树形背包倒着枚举不用多说,出现带有初值的加和时(比如 \(f_{x}\) 为了乘法有一个无意义的初值 \(1\),如果加和可能就会多个 \(1\)),或者自我转移,不要吝啬使用 tmp

调题时还出现了先垒子树 siz 再转移的情况,这样做复杂度是错的。必须先转移再 siz[x]+=siz[y]

P3515 [POI2011] Lightning Conductor

一个题再垃圾也不能垃圾到我洗澡的时候能想出来。

正确做法其实是决策单调性,但是带 \(\frac{2}{3}\) 常数的 \(\mathcal O(n\sqrt n)\) 不合法不优足够了。

P2150 [NOI2015] 寿司晚宴

塞质数的神。

首先很容易转换为需要两个人选择的寿司的质因数集合不同,也就是按位与为 \(0\)。然后你就可以用这个过掉 \(n\leq 30\),把 \(10\) 个质数塞进去就行。套个高维前缀和再灭一下大于一半的质数应该可以过 \(n\leq 200\) 吧。

你考虑,任何一个 \(\leq 500\) 的数都不可能包含 \(2\)\(>22\) 的质数。因为 \(23^2=529\)。然后 \(\leqslant 22\) 的质数只有 \(8\) 个,这就可以塞成 \(255\) 的二进制了。

然后我们继续考虑,可以注意到同一个大质数的一堆寿司都不能够同时分在两边,而不同大质数之间几乎不干涉(除了 \(255\) 那可以接受的部分)。所以我们考虑把所有大质因子相同的寿司(包括没有大质因子)都放到一起,然后每一类大质因子都分别做两个 dp:\(f1_{i,j}\) 表示开始之前乙的前八个质数长成 \(j\) 的样子,而这一种大质因子的寿司都给甲的方案数;\(f2_{i,j}\) 表示开始之前甲的前八个质数长成 \(i\) 的样子,而这一种大质因子的寿司都给乙的方案数。注意这里暗含了一个滚动数组,所以要谨慎转移顺序。

最后合并到 \(f_{i,j}\),表示大质因子寿司分配合法的情况下前八个质数在甲乙两边的表现情况是 \(i,j\) 的方案数。

考虑 \(f1,f2\) 的含义,我们发现前面那些质因子造成不同方案的影响是要算到里面的,所以我们在每一个大质因子的 dp 开始前 \(f1\gets f,f2\gets f\),再转移。

最后合并时使用 \(f_{i,j}\gets f1_{i,j}+f2_{i,j}-f_{i,j}\) 即可,减掉一个是因为 \(f1,f2\) 两边会重复统计一次两个人对这种寿司都不选的情况。

这样就做完了。很容易可以枚举子集实现做到 \(\mathcal O(n3^8)\)

posted @ 2024-06-20 16:29  Shunpower  阅读(33)  评论(0)    收藏  举报