做题记录 25.2.13

\(\textcolor{purple}\odot\) AT_agc034_c [AGC034C] Tests

\(a\) 固定时,对于 \(a_i<b_i\)\(c_i\) 一定取 \(l_i\),否则一定取 \(r_i\)

可证所有 \(a_i\) 中至多只有一个不为 \(0\)\(x\)

\(f(i,x)\) 表示令 \(a_i\)\(0\) 变为 \(x\) 对答案的增量

\(x\)\(a_i\) 数量一定时,显然优先选择 \(f(i,x)\) 大的 \(a_i\)\(x\) 更优

因此将 \(a_i\)\(f(i,x)\) 降序排序(同时交换其余几个数组的值)

二分 \(s\)

\(m=\lfloor\frac sx\rfloor\)\(a_i\)\(x\)\(a_x\)\(r=s\bmod x\),剩余取 \(0\)

\(bs=\sum_{i=1}^m f(i,x)\) 表示不考虑非 \(0\) 且非 \(x\)\(a_i\) 情况下的取值

\(\max(\max_{i=1}^m(bs-f(i,x)+f(i,r)+f(m+1,x)),\max_{i=m+1}^n(bs+f(i,r)))-\sum_{i=1}^n l_ib_i\ge 0\) 时当前二分值合法

答案上限为 \(\sum b_i\),注意处理 \(s\ge xn\) 的情况

时间复杂度 \(O(n\log V)\)

代码

\(\textcolor{purple}\odot\) AT_agc035_d [AGC035D] Add and Remove

考虑逆序 \(dp\),将删数改为加数,然后考虑加上数的贡献

显然 \(a_1\)\(a_n\) 对答案的贡献就是其本身

假设最后一步删去的为 \(1<i<n\),则 \(a_i\) 最后会计入答案两次

\((1,i)\) 范围中向右合并的部分和 \((i,n)\) 范围中向左合并的部分会计入答案两次

\(sol(L,R,lc,rc)\) 表示区间 \([L,R]\) 中,分割点以左向右合并会计入答案 \(lc\) 次,分割点以右向左合并会计入答案 \(rc\) 次的最小代价

则答案为 \(sol(2,n-1,1,1)+a_1+a_n\)

转移为

\[sol(L,R,lc,rc)=\min_{i=L}^R (sol(L,i-1,lc,lc+rc)+sol(i+1,R,lc+rc,rc)+(lc+rc)a_i) \]

\(L>R\) 则答案为 \(0\)

\(T(0)=1\)\(T(n)=\sum_{x+y=n-1,x\ge 1,y\ge 1}T(x)T(y)\),则时间复杂度为 \(T(n-2)\)\(n=18\)\(T(n-2)=35357670\),可过

代码

参考

\(\textcolor{purple}\odot\) AT_agc037_e [AGC037E] Reversing and Concatenating

特判 \(k=1\) 的情况,容易 \(O(n^2)\) 处理

\(ch\)\(s\) 中字典序最小的字符

显然需要最大化前缀的 \(ch\) 的数量

对于原串中的一段长为 \(l\)\(ch\),若其不为后缀,则容易通过一次操作移到末尾,然后每次操作都能使后缀的 \(ch\) 的数量乘以 \(2\),最后一次操作时可以在长度乘以 \(2\) 的同时移到前缀

因此若 \(k>15\),则答案为全变为 \(ch\)(此处特判是为了防止之后计算 \(2^{O(k)}\) 时溢出)

\(t\)\(s\) 和其翻转拼接后的结果,令 \(l\)\(t\) 中最长连续 \(ch\) 子段的长度,则最终前缀 \(ch\) 的数量为 \(\min(n,2^{l-1})\)(此时不需要判断是否在末尾)

\(2^{l-1}<n\) 则还要使之后的部分字典序最小

最终字符串的前缀 \(ch\) 后一个字符为最后一次操作前后缀 \(ch\) 的前一个字符,等于第一次操作后后缀 \(ch\) 的前一个字符,等于 \(t\)最长 \(ch\) 子段(结束位置 \(>n\))之一的前一个字符,等于 \(t\)最长 \(ch\) 子段(起始位置 \(\le n\))之一的后一个字符

再后一个字符也同理

因此对于 \(t\) 中每个最长 \(ch\) 子段 \([l,r]\),最终答案的前缀 \(ch\) 的剩余部分可以取 \([r+1,\ast]\)(取需要的长度)

暴力即可,时间复杂度 \(O(n^2)\)

代码

posted @ 2025-02-17 13:32  Hstry  阅读(3)  评论(0)    收藏  举报