第一次见可撤销贪心,还是个可以线性做的假标算(
首先大概讲一下线性做法。
排个序,注意到消防站和水栓的匹配没有交一定不会劣于最优解。
考虑顺序逆序各匹配一遍,分别找最近的没被匹配的。
将匹配连边。
于是将已经确定的匹配的贡献计算,然后没有确定的匹配一定是多出一个水栓,枚举去掉的水栓取最小值即可。
这个做法有点难写,所以我写了标算的可撤销贪心(
依然排个序,去掉绝对值。将每个坐标的相反数插入堆中,然后每次取出堆顶。
但是要支持撤销,那么就在堆中插入时计入撤销本次操作的贡献。
然后注意区分水栓和消防站。
具体可见代码。
代码:
1 |
|