做题记录 26.1.29
\(\textcolor{purple}\odot\) P12964 [GCJ Farewell Round #4] Old Gold
令 \(dp_i\) 表示 \(1\sim i\) 中最后一个金块在 \(i\) 的方案数,边界情况和统计答案是容易的,考虑转移
\(dp_j\to dp_i\) 当且仅当对于每个 \(i<k<j\),若 \(k\) 位置为 < 则 \(i+j>2k\),若为 > 则 \(i+j<2k\),若为 = 则 \(i+j=k\),= 至多出现一次,不存在 o
令 \(ll_i\) 表示 \(i\) 前面最近的 < 的位置,\(le\) 表示 = 的位置,\(lo\) 表示 o 的位置
则第五条限制等价于 \(j\ge lo_i\),第一条限制等价于 \(j>2ll_i-i\),第四条限制等价于 \(j>le_{le_i}\),三者并为形如 \(>L\) 的限制
第三条限制等价于 \(j>le_i\) 或 \(j=2le_i-i\),拆分为 \(>\max(le_i,L)\) 和单点 \(2le_i-i\)(需要判断是否 \(>L\))
通过数据结构令满足限制二的位置为 \(dp\),不满足的为 \(0\),则可以转化为查询区间和,考虑如何维护这一结构
发现每个 \(j\) 满足限制二时 \(i\) 为一段区间,加入后记录一下删去位置即可
时间复杂度 \(O(n\log n)\)
\(\textcolor{purple}\odot\) P12438 [NERC2023] Great City Saint Petersburg
对于固定的 \(a_{1\sim n}\),令 \(l\) 为其前缀 \(\max\),\(r\) 为其后缀 \(\max\),则答案为 \(\sum_i (\min(l_i,r_i)-a_i)=\sum_i (l_i+r_i-\max(l_i,r_i)-a_i)=\sum_i l_i+\sum_i r_i-n\max a_i-\sum_i a_i\)
后两项容易维护,问题转化为区间加维护前缀 \(\max\) 之和,容易线段树实现
时间复杂度 \(O(n\log^2 n)\),显然可以优化到 \(O(n\log n)\)
\(\textcolor{black}\odot\) P14804 [CCPC 2024 哈尔滨站] 一个朴素的字符串问题
对于单串的情况,类似 P1117 [NOI2016] 优秀的拆分,枚举串长的一半 \(L\),若合法则必然存在 \(i\times L\) 和 \((i+1)\times L\) 使得串前后两半分别与两者相交,求 \(\text{lcs}(i\times L,(i+1)\times L)+\text{lcs}(i\times L+1,(i+1)\times L+1)\) 是否 \(\ge L\) 即可
对于两串的情况类似 PKUSC2024 D1T1 回文路径,求 \(\text{lcp}\) 和 \(\text{lcs}\) 时先在当前串中贪心,然后再到另一串中选择即可
时间复杂度 \(O(n\log^2 n)\)

浙公网安备 33010602011771号