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

浙公网安备 33010602011771号