基站选址

看这篇题解

update 2024.7.5

重新做了一遍题目,差一点做出这道题目了

我的想法是,先考虑所有村庄都要赔偿,然后考虑在哪些村庄安装基站可以得到最多的退款

但是这样显然也要知道最后一个基站建在哪里,但是我们显然不能再开一维表示最后一个基站建在哪里,所以只能认为最后一个基站就建在最后一个村庄

\(f[i][j]\)表示前\(i\)个村庄,一共建\(j\)个基站,并且第\(i\)个村庄安装基站可以获得的最多的退款

\(f[i][j]=max(f[i-1][k]+value[k+1][i-1])-c[i]\),其中\(value[k+1][i-1]\)指的是介于\(k\)\(i\)之间的村庄被\(i\)或者\(k\)覆盖的村庄的退款

这个时候我们一定要有这个思想(没做出来就是因为没有想到这个思想),数据结构优化DP很重要的一点就是考虑假设我们前面已经维护好了,而现在某一维增加了\(1\),考虑这个增加的\(1\)会带来什么改变而不是直接思考全局如何维护,一次性维护完,后面就只查找

这里的话,假设\(i\)增加了\(1\),那么显然就是原来只被\(i\)覆盖没有被\(k\)覆盖而且不能被\(i+1\)覆盖的村庄的退款会从能得到变成不能得到,于是我们考虑所有覆盖右端点在\(i\)的村庄,设某一个村庄为\(p\),那么对于村庄\(1\)~\(st[p]-1\)\(st[p]\)是村庄\(p\)的覆盖左端点),都无法获得村庄\(p\)的退款,于是直接用线段树修改就好了

题解的话就是不用想这么多,直接DP就好了,维护方法是类似的,总之还是要记住这个重要的思想

posted @ 2024-02-29 17:57  最爱丁珰  阅读(1)  评论(0编辑  收藏  举报