796. loj4130 「PA 2024」Splatanie ciągów
假装 \(f(A,B)\) 怎么求大家都知道。怎么数数呢?怎么数数呢?怎么数数呢?怎么数数呢?怎么数数呢?
先把串变形成一堆连续的 < > 序列,我们只关心连续段大小。计算 \(|A|\geq |B|\) 的贡献。考虑枚举 \(f(A,B) \leq x\),套一层分治,计算跨过 \((mid,mid+1)\) 的贡献。发现两边贡献给 \(f(A,B)\) 的东西独立,各是一堆区间。枚举出这些区间,考虑暴力计算。为了方便,可以把 \(m - \text {端点}\) 扔到另一边的端点集合里。
对于左边贡献为 \(i\) 长为 \(l\),右边贡献为 \(j\) 长为 \(r\),贡献大概是一个 \(g(l,\min(r,m))\) 的形式。那么考虑速通左侧一整个段的贡献。对于右边的一个前缀,贡献是 \(g(l,r)\)。对于右边的一个后缀,贡献是 \(g(l,m)\)。推式子嗯造。对于右边中间的那部分,贡献比较神秘。注意到两段长度相等,所以简单推推式子肯定也能做。
综上就以 \(O(n \log n \ln n)\) 的垃圾复杂度解决了这个题。
单 log 狗都不学。
797. loj6777 「2021 营员交流」大毒瘤
798. qoj1223 Petrozavodsk Winter 2023. Day 7: Gennady Korotkevich Contest 7
799. qoj8227 圆
800. qoj8228 排序
不知不觉编号上 800 了!
801. qoj8229 栈
802. qoj1475 The 2nd Universal Cup. Stage 18: Dolgoprudny
A
不知道写啥,就写个 A 吧!
我看到这个题的时候非常震撼,因为模拟赛出过一样的题,但是那题 \(n = 100\)。我一看 \(10^7\) 吓了一跳,我得坐起来跟他打。
模拟赛的时候我还完全不懂流,所以对那个图没啥办法,只懂分治匈牙利,造出了一个 \(O(nm^2 \log m)\) 的垃圾玩意。现在?大概懂了一点吧。
但是我还是不懂怎么不换根。算了别懂了。
803. qoj1009 Petrozavodsk Summer 2022. Day 2. ZJU Contest 1
I
来写个我的做法。
考虑如何 \(cmp(x,y)\)。
把 \(x,y\) 后续的第一次出现的字符的位置集合拿出来,切成 \(O(|\sum|)\) 个段。每个段内部以及端点是独立的。如果哈希值不相等就进行 lcp。
总复杂度 \(O(n \log n |\sum|)\)。
B
题比较 sb。有意思的是求一个多边形的对称轴。
Z 函数那个做法我看不懂,有无大哥教教 /kel。
我们定义,一条合法的对称轴交多边形于某条边的中点或某个端点。假设是点。枚举这个点,如何判断这个多边形关于它对称呢?考虑一个类似双指针的方法,从这个点开始,往左往右每次 expand 一条边或者一个角,如果相等就继续,不等说明不对称。
形式化地,假设要判断 \(i\) 号点是否是对称轴端点,写出序列 \(\alpha_i,l_{i},\alpha_{i+1},l_{i+1},...,l_{(i-1)\bmod n},\alpha_i\),判断其是否回文即可。
使用任意字符串技巧都可。特别地,当多边形是凸的时,可以使用 \(cross(i-1,i)\) 代替 \(\alpha _{i}\)。
H
感觉是特别好的题。
首先你得会双极定向。前置知识是 https://www.cnblogs.com/yyyyxh/p/ear_decoposition_bipolar_orientation.html 和 https://www.luogu.com.cn/article/dup8ri82 。虽然这个题 \(O(n^2)\) 的找出所有耳然后 relabel 的做法可以过,但是 \(O(n)\) 的双极定向很有意思,建议学一学。
然后考虑有拓扑序之后怎么构造方案。倒序构造,保证拓扑序在 \([i,n]\) 的导出子图合法。考虑加入第 \(i\) 个点。那么操作的意义大概是从子图里选一条链,整体往前拉一格,然后把 \(a_1\) 放到链尾。显然这条链链头是 \(i\),考虑不断往值最小的儿子扩展,直到最小的儿子权 \(< a_1\)。发现这特别牛,所以我们只需要 \(n-1\) 次操作。