星座 3 (Constellation 3)
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\),则一定放弃当前星星更优。
否则,就暂时放弃之前的星星,之后做反悔贪心。
对有冲突的横坐标范围可以用两个并查集维护(一个向左一个向右),区间修改和查询有冲突的星星的权值可以用树状数组等进行维护。