模拟赛 3
12.20
复建!!!
发现自己脑子真锈了,直觉还是有的往下一步就想不到了。
ARC189A
首先每个颜色段是独立的,而且合法当且仅当 0 段左右两端点均为偶数,1 段左右两端点均为奇数。
考虑只有一个颜色段的时候贡献怎么算,考虑增量有 \(f_i=f_{i-2}\times i\)。
然后多段时就是再乘上一个 \(\frac{i}{2}\) 的多重集组合数。
ARC189B
令这四个数为 \(a,b,c,d\),那么交换造成的影响是变为 \(a,a+d-c,a+d-b,d\),可能不太好看我们差分一下就有 \(b-a,c-b,d-c \to d-c,c-b,b-a\)。
其实就是交换差分,奇偶分别维护一下就行。
ARC189C
最好猜的一集,对于 \(p,q\) 先拉出置换环,有解显然当且仅当除了 \(x\) 所属置换环,其余置换环上均为 \(0\)。
然后你把置换环从 \(x\) 处断开,答案就是两个链长减去两个链的 LCS,方案可以通过先对按照 \(p\) 操作遇到一个 LCS 上的点就按照 \(q\) 操作直到相同的点,可以证明没有更优的方案。
有个细节是你的链需要去掉前导零。
ARC189D
最水的一集,加个记忆化直接搜就行,甚至线性。
12.21
被诈骗骗了一整场,最后过了依旧以为是数据水了/lh/lh/lh
T1
不太懂证明,总之就是 \(16\) 个 \([1,2^{30})\) 范围的数,任意排列后一定有 \((a_1\oplus a_2) \land \dots \land (a_{15}\oplus a_{16})=0\)。
T3
考虑每个数只能用一次一种很优的凑数方案是 \(\log_k 2V+\lfloor\frac{k-1}{2}\rfloor-1\),其中 \(k\) 是进制数,\(V=10^8\) 时 \(k=9\) 取最优。
ABC385F
又上回 1Dan 了,虽然 G 是个原把,但是好像不过 G 也是 2400 perf。
懒得帖别的题的题解了。
首先这个题就是让你对每个点求别的点到他的最小斜率,直接上个凸包扫一遍就行了,线性。
12.22
写串串只会度过一个绝对失败的人生。
CF1098F
我将以 SA 形态出击。
想了一下午笛卡尔树然后启发式分裂最后坠机了呜呜呜。
最后写的是基于 zltqwq 的做法的做法,简单异常。
考虑对 \(h\) 数组分治,对于每一个跨中点的贡献 \((k,rk_l)\),那么答案为 \(\min\{pre_{k+1},suf_{rk_l},r-sa_k+1\}\)。
考虑钦定每一个值为最小值然后列不等式,第二个情况解出来是 \(sa_k\in[l,\min\{r-suf_{rk_l}+1,r\}]\land pre_{k+1}\ge suf_{rk_l}\),第三个是 \(sa_k\in[\min\{l,r-suf_{rk_l}+1\},r]\land pre_{k+1}+sa_k\ge r+1\),直接套个二维数点就行。
对于第一种情况是个三维偏序,但是实际上只用把他的贡献提前算上,最后摊到另外两种贡献上减去就行。
然后对于 \((rk_l,k)\) 的情况同理。
综上我们得到了一个做四遍二位数点的 \(O(n\log^2 n)\) 做法,常数比 zlt 的稍微小一点。
实现以后补。
UPD on 12.24:补在 P5161 了 submission
P4482
存在 Border Thoery 的 1log 做法。
和上面的本质相同,一样是把贡献拆到 \(pre_{k+1},suf_{rk_l},r-sa_k+1\) 三部分,最后的答案形式是一个矩形取 \(\min\),扫描线一下就行了。
12.23
花花场。
P9266
写的牛逼大常熟 2log,5e5 3s 跑不动见过没?
考虑这个括号串的配对有个啥性质,我们把配对的一对括号看成一个节点,那么他们中间的肯定是一个和法括号串,不妨依照这种关系建图,每个节点向上一层包含他的括号连边,发现构成了一棵树,然后对于一个区间的贡献就可以记录前缀贡献后缀贡献然后树上前缀和维护了,使用 \(O(1)\) 查询的 LCA 和 K 级祖先可以做到 \(O(1)\)。
我们设上面的贡献为 \(W(i,j)\),在不考虑 \(k\) 的情况下可以很轻松写出 DP \(f_i=\min_{j<i} f_j+W(j+1,i)\),加上 \(k\) 的时候也就是上个 wqs 二分,然后对于这个 DP 式子,其中 \(W(j+1,i)\) 的计算方式类似于平方和,感性理解一下是满足四边形不等式的,用单调队列加二分即可做到一个 log,加上 wqs 的复杂度,总复杂度是 \(O(n\log^2 n)\),经过卡常后洛谷上实测 100 个点跑进了 17s。
P6246
上面那个东西的弱化版,直接设 \(f_i=f_j+W(i,j)\),其中 \(W(i,j)\) 是编号在 \((i,j]\) 范围内的村庄的贡献,对于 \(\frac{a_i+a_j}{2}\) 左侧的村庄和右侧的村庄分别计算即可,因为值域较小可以轻松的做到 \(O(1)\)。
然后再套个 wqs 和单调队列就做完了,复杂度 \(O(n\log^2 n)\)。
QOJ#2570
首先有一个流的部分分做法,根据这个玩意发现我们实际要找的就是图上的增广路,但是每个点只能走一次。
我们先对于这个 \(f_i\) 给点分个层,不难发现每层的点权是单调不增的,然后我们从前往后扫,为了避免反悔操作我们肯定是优先走他之前的满足 \(f_j=f_i-1\land a_j<a_i\) 的 \(a_j\) 最大点,然后对于每层维护一个指针暴力扫一遍就做完了。
最后答案是增广路数量。
P11303
比较牛,我们考虑额外贡献从哪来,对于左边的点 \(i\) 来说只有可能是突然拐到右侧的点 \(j\) 然后又拐回来,造成的贡献是 \(2(p_j-p_i)(i-1)\),另一种情况是对称的。
然后直接设 DP \(f_i\) 表示走到 \(i\) 的最小额外代价,拆完式子是一个左右相互转移的斜率优化,转移是一个 dij 的形式,感性理解一下在当前属于 dij 决策点的点一定形如一个区间,所以维护两个指针左右扩展即可。
初始令 \(f_k=\sum_{i=1}^n |p_i-p_k|\),那么答案就是 \(\min\{f_1,f_n\}\)。
12.24
感觉虽然现在自己在校不碰崩了,但是效率还是上不来。
又是做串串和啃 border thoery(已经弃了,但是之后还是要补一下 P4482 的 IPM 做法)的一天。
P9623
我去我才发现我倍增求 SA 的码多测有锅。
提供一个常数巨小且非常简单的 2log SA 做法。
基于 zltqwq 的这篇题解。
简单模拟一下两个字符串比大小的过程,即,求出 LCP 比较 LCP 后一位的字符大小。
对于后一位的字符大小我们可以通过原串上的 rk 求得。
因为有二维限制所以较为显然的对于 sa 数组上个分治,令 \(pre_i=\min_{j=i}^{mid} h_j,suf_i=\min_{j=mid-1}^i f_j\)。
那么跨过 \(mid\) 的区间 \([l,r]\) LCP 可以表示为 \(\min\{pre_{rk_l+1},suf_{rk_r}\}\)。
那我们现在就可以按照 rk 和原串中的位置关系去分讨了。
- \(rk_i<rk_k\land i<k\),因为 \(rk_i<rk_k\) 的缘故且后缀 \(i\) 还比后缀 \(k\) 长,所以我们要想使 \(i\) 对答案有贡献只能让 \(\min\{pre_{i+1},suf_{rk_k}\}<r-k+1\),反之 \(k\) 的下一位就为空了一定小于 \(i\),对于实现上我们要分两种情况计数。
- \(suf_{rk_k}<r-k+1\),这时候 LCP 一定小于 \(r-k+1\),所以直接统计 \([l,k-1]\) 范围内的点数就行了。
- \(suf_{rk_k}\ge r-k+1\),这时候我们要统计的实际就是 \(pre_{i}<r-k+1\) 的 \(i\) 的数量,直接和 \(sa_i\in[l,k-1]\) 一起做就是一个二维数点,扫描线即可。
- \(rk_i>rk_k\land i<k\),因为 \(i\) 不仅 rk 比 \(k\) 大,而且串还比 \(k\) 长,所以一定不被计数。
- \(rk_i<rk_k\land i>k\),和上面同理,只不过是一定被统计。
- \(rk_i>rk_k\land i>k\),和 1 差不多,只不过限制是 \(\min\{pre_{rk_p+1},suf_i\}\ge r-sa_i+1\) 也就是 \(pre_{rk_p+1}\ge r-sa_i+1\land suf_i\ge r-sa_i+1\)。对于第一个式子化简一下有 \(sa_i\ge r-pre_{rk_p+1}+1\),也就是对于 \(sa_i\) 的范围为 \([\max\{k+1,r-pre_{rk_p+1}+1\},r]\);对于第二个式子化简一下有 \(sa_i+suf_i\ge r+1\),两个限制一起做就是一个二维数点。
综上,我们得到了一个 cdq 分治套二维数点的两个 log 小常熟做法。
(提一嘴多测有锅的事,具体就是我清空是用 memset 可丁可卯得清的,但是写法不精细会导致有的时候你需要使 \(rk_{n+1}=0\),然后就寄了
P5161
和 CF1098F 一样,另外实现了一下那题我胡的做法。
就是答案肯定是 \(\min\{pre_{i+1},suf_j,sa_j-sa_i-1\}\),对于后两个和那题一样解个不等式转化成二维数点就行。
对于第一个你容斥一下,先都加上最后在改后两个加上一个 \(-pre_{i+1}\) 的贡献减去即可。
P6292
开始老老实实搞 SAM 大 DS 题了。
类似的 trick 之前的模拟赛见过。
首先显然的你先离线,考虑在右端点处统计答案,对于子串我们要多次出现看成一次,那你就钦定每个子串只在当前最后一次出现处造成贡献,那么你每次加个字符相当于是改一条树链上的贡献,你考虑用 LCT 维护这个过程,那么操作只有 access,并且惊讶地发现每个 splay 的最后出现位置是相同的,然后因为 parent 树的性质,你每次操作相当于是给一个串长区间加一减一,直接做就行。
复杂度是均摊 \(O(n\log^2 n+q\log n)\)。
P4022
为啥这个有黑。
首先先二分,然后直接设 DP \(f_i=\max\{\max_{j\in [i-len_i,i-mid]}f_j+i-j,f_{i-1}\}\),其中 \(len_i\) 是 \(S[1:i]\) 在 \(T\) 中的最长匹配后缀。
上面那个式子因为 \(i-len_i\ge i-1-len_{i-1}\),所以直接上单调队列就做完了。
12.25
谁家好人模拟赛放俩计算几何???
CF1326G 懒得改了,以后补。
QOJ#73
算是签到,比 NOI2024 Day1 T2 简单。
首先这个 log 提示的还是比较显然的,一个常数较小的做法是分治,但是对半砍的话复杂度不是很优,考虑不均分,打表发现每次取 \(\frac{1}{3}\) 的时候很优,然后加点剪枝就做完了。
fun fact:赛时没把剪枝算进暴力打表,以为过不去,结果一测随机数据 \(1.05\times 10^5\to 6.6\times 10^4\) 就过了。
CF1641F
有点神秘。
考虑 P5974 的做法,二分 \(r\),然后枚举点 \(p\) 对于每个点 \(i\) 去与 点 \(p\) 求相交弧,然后 check 有没有一段弧被 \(k-1\) 个点交得。
上面这部分做法是 \(O(n^2\log n\log V)\) 的,本题还多了个 \(l\) 的限制,直接做显然暴毙,考虑利用 \(k\) 很小的性质。
因为我们要求原 \(i\) 与圆 \(p\) 的交,所以相距肯定小于 \(2r\),那么我们按照 \(2r\) 对网格图划分,那么每次只用查周围九个格子中的点。
因为保证了点的随机,所以只要我们的 \(r\) 的初值设的好,那么复杂度只有 \(O(kn\log n\log V)\),题解给出了这个玩意是 \(\sqrt{2}\cdot 10^8\cdot \sqrt{\frac{l-1}{k-1}}\)。
然后就是这个 \(l\) 的限制该如何处理,我们考虑二维数点,对于一个长度为 \(l\) 的区间我们在他的右端点处统计答案,那么对于一个点 \(i\) 它的影响区间是 \([i,i+l)\),扫描线即可。
复杂度还是 \(O(kn\log n\log V)\),因为本来 check 就带个 log。
P5576
这不是我们树上查询吗。
考虑那题的启发式合并做法,可以得到 \(O(n\log n)\) 个支配对,然后直接拉下来二维数点就行了,小卡一手空间。
不懂为啥有黑。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步