做题记录 26.4.1

\(\textcolor{purple}\odot\) AT_agc017_d [AGC017D] Game on Tree

\(f_u\) 表示子树 \(u\)\(\text{SG}\) 函数值,则 \(f_u=\bigoplus_{v\in son(u)}(f_v+1)\)

容易做到 \(O(n)\)

代码

参考

\(\textcolor{purple}\odot\) AT_agc017_c [AGC017C] Snuke and Spells

对于一个 \(a\),令 \(c_i\) 表示其中 \(i\) 的数量,对于每个 \(c_i\)\(t_{i-c_i+1\sim i}\) 加一,则操作次数为 \(t_{1\sim n}\)\(0\) 的数量

正确性显然,容易 \(O(n+q)\) 维护

代码

参考

\(\textcolor{purple}\odot\) AT_agc019_c [AGC019C] Fountain Walk

先翻转为终点在起点右上角的情况,删去两者组成的矩形之外的点,剩下点按 \(x\) 坐标从小到大排序

显然在 \(100(x_r-x_l+y_r-y_l)\) 的基础上,每通过一个点可以减小 \(20-5\pi\),最大可减小的次数为排序后 \(y\) 坐标的 \(\text{LIS}\)

\(\text{LIS}\) 等于 \(x_r-x_l+1\)\(y_r-y_l+1\),则还需要加回 \(5\pi\)

容易做到 \(O(n\log n)\)

代码

参考

\(\textcolor{purple}\odot\) AT_agc019_d [AGC019D] Shift and Flip

不妨假设向右转的距离不小于向左转的距离(否则倒过来计算一遍即可)

枚举旋转距离 \(r\),令 \(c\)\(a\) 旋转后的字符串

显然操作分为旋转部分和修改部分,先将 \(r\) 计入旋转部分

修改部分的总次数显然为 \(c_i\ne b_i\) 的数量,对于一对 \(c_i\ne b_i\),显然对应 \(a_{i-r}\)(默认下标已经循环取模),若 \(b_{i-r}\sim b_i\) 中存在 \(1\) 则旋转到某个中间态时可以顺便修改此位置

否则,若 \(b\) 不存在 \(1\) 则当前方案无解,否则找到 \(i-r\) 上一个 \(1\) 到其距离 \(L\)\(i\) 下一个 \(1\) 到其距离 \(R\),显然旋转过程可以分解为先向左 \(L'\),再向右 \(L'+r+R'\),再向左 \(R'\),这样一组 \((L,R)\) 产生约束 \(L'\ge L\lor R'\ge R\)

找到 \(L'+R'\) 最小且符合所有约束的一组计入旋转部分操作次数即可

容易做到 \(O(n^2)\)

代码

posted @ 2026-04-02 12:49  Hstry  阅读(4)  评论(0)    收藏  举报