做题记录 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\)
转移为
若 \(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)\)

浙公网安备 33010602011771号