CSP-2024 第二次
挂 corner case 了,哈哈
A
对于值域上每个连续的长度为 \(L\) 的段,其贡献为 \(\left\lceil\dfrac l2\right\rceil\),并查集维护连续段即可。
B
先把答案分解成 \(O(\log n)\) 个子树和,然后注意到点 \(x\) 的子树和是 \(x\) 的一次函数,且这个一次函数 \(F_l\) 只与 \(x\) 点的区间的长度 \(l\) 有关。
发现 \(F_l\) 的系数可以 \(O(\log l)\) 递推,然后就做完了。
C
发现对每个点找最优匹配很没前途,所以考虑分治合并答案。
先把 \(\max\) 分讨掉,\(a_p+a_q>b_p+b_q\Leftrightarrow a_p-b_p>b_q-a_q\),
于是要求的就是 \(a_p-b_p>b_q-a_q\) 的 \((p,q)\) 的 \(a_p+a_q\) 最小值,以及 \(a_p-b_p<b_q-a_q\) 的 \((p,q)\) 的 \(b_p+b_q\) 最小值,
把所有 \(p\) 以 \(a_p-b_p\),\(q\) 以 \(b_q-a_q\) 插入同一棵权值线段树,在每个节点上维护答案即可。
D
答案就是每株杂草被拔掉之前走的距离之和,所以可以考虑每株杂草的贡献,
可以发现每株杂草的初始贡献为其到 \(k\) 的距离,向其靠近一步贡献不变,远离一步贡献 \(+2\),
设 \(f_i\) 表示走到 \(i\) 时贡献和的最小值,则有:
(可以钦定 \(i\le k\le j\),因为推一下式子可知 \(i,j\) 在 \(k\) 同侧的转移没用)
答案就是 \(f_1\) 或者 \(f_n\)(容易发现 \(f_1=f_n\))。发现转移有环,所以考虑模拟 Dijkstra。
注意到 \(k\) 向左、向右 \(f\) 值分别单调递增,则 Dij 的过程中已经确定的位置一定是包含 \(k\) 的一个区间 \([l,r]\),
从这个区间转移到 \(f_{l-1},f_{r+1}\),则下一个确定的位置一定是其中较小的一个,斜率优化转移即可。