2025 nowcoder round1

2025 牛客多校 round1 补题

C - Clamped Sequence 2

给定序列 \(a\) 和价值 \(w\) ,对于一个 \(d\) 选定一个 \(l,r,0\leq r-l \leq d\) 使得 \(\sum_{i=1}^{n-1} w_i |a_i-a_{i+1}|\) 最大,\(d\) 多组询问,\(n\leq 1000,Q \leq 10^6\)\(w_i\) 可能时负数。

若选定的 \(l,r\) 没有一个在 \(a_i\) 的边界上,则上下平移区间贡献是相反数,总有一个是非负的,因此 \(l,r\) 其中一个一定是某个 \(a_i\)

考虑设 \(l=a_i\) ,我们记 \(a\) 排序去重后的序列为 \(s\) ,在 \(r\) 逐渐增大的过程中,整个序列的价值按照 \(s\) 分割成若干个段一次函数,可以求出每一段的一次函数 \((u,v,k,b)\) 意为 \(y=kx+b\) ,在 \(u\leq r-l \leq v\) 时取到,每一个 \(a_i\) 能产生 \(O(n)\) 个一次函数,总共有 \(O(n^2)\) 个一次函数。

\(w_i\) 可能是负数,那么一次函数的 \(k\) 可能是负数,此时需要取前缀最大,此时可以令 \(k=0\)\(v=+\infty\)

得出这几个函数,我们发现能取到最优的 \(d\) 的可行值只可能为所有 \(a_i-a_j\) 和所有询问的值,因此可以离散化后将线段加到李超树里查询(也可以动态开点,但我不确定能否跑得过)。当然也可以将线段加到线段树中每个区间求半平面交,询问按 \(d\) 排序离线查询也可以,前者是两个 \(\log\) 后者只有一个。

posted @ 2025-08-25 22:17  蒻蒻虫  阅读(9)  评论(0)    收藏  举报