Problem
【NOIP2017模拟3】任性的国王
Description
X 国的地图可以被看作一个两行 列的网格状图。现在 X 国需要修建铁路,然而该国的国王非常小气,他只想保证位于某两列之间的所有城市互相可以到达就行了,在此基础上,他希望所花费的代价最小。
铁路可以建在任何两个相邻的点之间,使他们可以互相到达。可以作为工作人员,你已经整理出了为每一对相邻城市架设铁路所需要的花费。你需要准备好回答国王如下形式的问题。
对于 :当前情况下,使第 列到第 列之间的所有城市连通的最小代价是多少(列下标从 开始)?注意不能用其他列的城市。
然而你还有更大的困难,随着时间变化,使用某些边作为铁路的代价会发生改变,你必须有效率地处理这些变化。
Input
第一行两个正整数 ,表示该国有 行 列以及 个询问或者操作。
第二行 个数,前 个数依次表示在第一行的 条边上修建铁路的代价。
接下来 个数,依次表示在第二行的 条边上修建铁路的代价。
最后 个数,依次表示在第 列到第 列的边上修建铁路的代价。
接下来 行的输入具有如下形式,,其中
- 若 ,则表示询问当前状态下,使所有第 列到第 列之间的城市连通需要的最小代价。
- 若 ,则表示位于第 行第 列的点到第 行第 列的点之间的边上修建铁路的代价变为 。
- 若 ,则表示位于第 行第 列的点和第 行第 列的点之间的边上修建铁路的代价变为 。
- 若 ,则表示第 列的边上修建铁路的代价变为 。
Output
Sample Input
1 | 4 14 |
Sample Output
1 | 6 |
Constraint
对于 的数据:。
另有 的数据:所有竖边的代价为 且永不改变。
对于全部数据:。
所有输入和输出数据保证合法,且不超过 。
Source
标签:线段树
MST
Solution
线段树维护特殊的网格图。
对于每个区间,维护四个值,分别代表第列的竖边选/不选且第列竖边选/不选的情况下,将第个网格到第个网格中所有点连起来的最小代价。
用表示第个网格上/下的边,用表示第列的竖边,那么第个网格相邻的两条竖边为。
对于长度为的区间,直接赋初值:
对于其余区间,需要从两个子区间合并而来。设左右区间为,则两区间相交处的竖边为。
那么对于此区间的,一定从和合并而来。如果用和合并,其合并出的所有情况的权值无法直接算出,但其一定能由其余的三种合并方式得到,于是可以不用管这种合并方式。注意合并时第列的两条边会在两棵生成树中均联通,所以需要删去其中一棵中连接两点的边,即减去。
由此,我们用线段树维护这个信息,对于修改,直接到该位置重新赋初值然后维护其祖先的信息即可。
时间复杂度。
Code
1 |
|