做题记录 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)\)

代码

posted @ 2026-01-30 07:40  Hstry  阅读(0)  评论(0)    收藏  举报