做题记录 26.3.28

\(\textcolor{purple}\odot\) AT_agc069_a [AGC069A] Schedule Optimization

考虑贪心

从叶子向上处理,目前处理到某个非叶子,设此时一侧为 \([l_1,r_1]\),一侧为 \([l_2,r_2]\)

当两者有交时,显然最优方案是并到 \(r\) 较大的一个上,从而变为 \([\max(l_1,l_2),\max(r_1,r_2)]\)

当两者无交时,不妨设 \(l_1\le r_1<l_2\le r_2\),不考虑代价则将 \(l_2\) 减小到 \(r_1\) 最优

但有可能 \(l_2\) 每减小 \(1\) 会产生较大代价,而显然 \(r_1\) 增加 \(1\) 的代价必定为 \(1\),从而此时增加 \(r_1\)\(l_2\) 更优

令移动 \(l_2\) 的单位代价为 \(c\),若 \(c=1\) 则移动 \(l_2\),否则先将 \(r_1\) 移动到 \(l_2\),然后让 \(l_2\) 移到 \(r_1\) 的代价为 \(c-1\)

对于每个子树,维护子树内的左端点序列(不含 \(c\)\(l\)

一个结点处,先将两个儿子的序列归并,然后加入 \(c_1\)\(l_1\)\(c_2\)\(l_2\)

令当前结点的 \(c\)\(l_2\) 数量(假定 \(l_1\le l_2\)),并删去所有 \(l_2\)

两区间有交则直接返回

\(c>1\),则放回一个 \(r_1\) 并让 \(c\) 减一,并返回

否则 \(c=1\),移动 \(l_2\),进行相应的修改

精细实现可以做到 \(O(n2^n)\)

代码

参考

\(\textcolor{purple}\odot\) AT_agc070_a [AGC070A] Multiples in the String

考虑找到一个全循环素数 \(p\),即 \(\frac 1p\) 的循环节长度为 \(p-1\),满足 \(p>1000\)

\(R=\lfloor \frac 1p\times 10^{p-1}\rfloor\),即 \(\frac 1p\) 的循环节

\(R_2=\lfloor\frac 1p\times 10^{2(p-1)}\rfloor\),即 \(\frac 1p\) 两个循环节拼接

对于任意 \(1\le i\le 1000\),显然 \(R\times i\)\(R_2\) 的子串

\(p\) 合法当且仅当 \(10\)\(p\) 的原根,容易 \(O(p)\) 检查

枚举即可找到合法的 \(p\),最小的为 \(1019\)

代码

参考

posted @ 2026-03-29 07:32  Hstry  阅读(1)  评论(0)    收藏  举报