星座 3 (Constellation 3)

发布时间 2023-06-07 10:18:27作者: Schucking_Sattin

G 星座 3 (Constellation 3)

总述:做法很多,一道练习各种套路的有价值的题。

对横坐标考虑一个区间 \([l, r]\),若该区间上建筑高度的最大值为 \(x\),则该区间内 \(> x\) 的星星数量不能超过 \(1\) 个。

对建筑高度建出 笛卡尔树,于是每个节点对应一个区间以及区间高度最大值(即当前子树根节点对应的高度),这样我们只需考察 \(O(n)\) 个区间。

不妨统计最大能保留下来的星星价值,用总价值减去它得到答案。

Solution 1

线段树合并 / 启发式合并。

Solution 2

把笛卡尔树当成一棵普通的树形结构考虑,保留一个坐标为 \((x, y)\) 的星星相当于在树上覆盖一条对应权值的祖孙链。

这条链的两端点分别为 \(x\) 位置对应的节点 \(v\) 和一个祖先节点 \(u\),满足 \(h_u < y\)\(h_{fa_u} \ge y\)\(u\) 可以倍增求解。

因此问题转化为:有若干祖孙链,选择一些使它们两两不交,求选择的链权值和最大值。

Solution 3

直接贪心考虑如何保留最大星星价值。

将星星按纵坐标从小到大排序。

若当前星星不会与已选星星发生冲突,直接选上。

否则考虑是放弃当前星星,还是选择当前星星而放弃与其有冲突的星星。

记与当前星星有冲突的星星的权值和为 \(w\),当前星星权值为 \(c\),若 \(w \ge c\),则一定放弃当前星星更优。

否则,就暂时放弃之前的星星,之后做反悔贪心。

对有冲突的横坐标范围可以用两个并查集维护(一个向左一个向右),区间修改和查询有冲突的星星的权值可以用树状数组等进行维护。