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\) 时贡献和的最小值,则有:

\[f_i+2(i-1)(s_j-s_i)\to f_j\\ f_j+2(n-j)(s_j-s_i)\to f_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}\),则下一个确定的位置一定是其中较小的一个,斜率优化转移即可。

posted @ 2024-09-08 08:08  5k_sync_closer  阅读(127)  评论(0编辑  收藏  举报