100 篇题解祭。
你告诉我这题只有 2200?这不要比某些题难多了?
我们考虑对 (k) 分类。
-
(k=0)。那不用修改了,直接做吧;
-
(k>1)。我们可以发现,如果真的把它当成一个有向图,然后求传递闭包啥的话,是肯定不可做的,所以一定有比较简明的结论。我们考虑答案的上限,就是用最小的代价获得最大的价值,也就是激活代价最小的一个原子,然后得到所有原子的价值。这能做到吗?不难想到一种方案,(forall iin[1,n)),只需要令 (E_i=1,E_{i-1}=i+1)((i=1) 则不用动),则可实现从 (i) 开始经过所有点。但是这还不完美,(i=n) 的时候无法实现,要是偏偏 (d_n) 最小该怎么办呢?我们考虑从 (n) 出发的情况,显然它不能有出边,所以只能激活它本身,所以可以看作相对独立的;
-
(k=1)。按照剧本,这三种情况应该主次分明,所以 (k=1) 是主(
我们考虑修改的是 (E_i)。那么分为两种情况,一是往前连,一是往 (i+1) 后面连。根据贪心,连 (1) 和连 (i+2) 分别是所在情况中最优的,因为这样它们的所有点的传递闭包都包含其他情况下该点的传递闭包。于是对两种分别求一下即可。
连 (1) 的话,两边是断开的,左边是个环,右边是个链,都异常好求;连 (i+2) 还稍微有点东西,被激活的点的集合分为三种情况:
- ([i+1,n]) 的一个后缀。这个预处理一下随便求;
- ([1,i]cup[i+2,n]) 的一个后缀,这个显然先当作 ([1,n]) 再把 (i+1) 的减掉即可;
- ([1,n]) 的一个后缀,这个先直接求,但是注意到要激活的不只有最有后缀的左端点,还有 (i+1),加上去即可。
总的来说,这是一个非常不错的分类讨论题。下次看到这种按照算法不可做的题,一定要坚定信念寻找结论。