题意
给长度为$n$的序列$a[n]$和$b[n]$,初始时$ans=0$,有以下操作:
- $ans=ans+a[i]$
- 如果$b[i]\neq-1$,则$a[b[i]]=a[b[i]]+a[i]$
问每个元素操作一次后,$ans$最大为多少,并输出操作序列
分析
对于一个数,如果他有前驱的话,可以考虑对于其某些前驱进行操作后再操作该数,那么画一个前驱图可以发现,这是一个拓扑排序的题,操作到某个节点时
- 如果该节点的值大于$0$,说明将其操作到后续节点一定是更优的
- 否则,这个节点一定要晚于其后续节点操作,否则会将该节点的值再贡献一次
那么拓扑排序的时候维护一个队列和一个栈,对于值大于$0$的节点,将其放入队列中,然后将其值加入后续节点,否则将其放入栈中(因为若连续两个节点值都小于$0$,那么应先操作后续节点),最后输出即可
1 |
|