提问启发式合并

P3201 [HNOI2009] 梦幻布丁

求问原因。 样例正确的输出: ```cpp 3 1 ``` **第二份代码**的错误输出: ```cpp 3 0 ```
by Rainsleep @ 2022-12-17 10:52:00


orz~~我不会~~
by Aranea晨曦 @ 2022-12-22 21:54:02


@[Rainsheeep](/user/666796) 我也遇到了这个问题。你可以模拟一下形如```1 1 1 2 1 1 1```(当前要把1变成2)的情况,实际上的修改是瞬间完成的,如果你把中间的每一种状态都拿出来单独计算,不好维护当前的颜色段(即改了前面的可能会新增新的颜色段,但程序只计算了减少量)。
by lao_li @ 2023-02-16 18:28:41


是这样的,两个 $for$ 执行的任务是不一样的,上面的 $for$ 负责的是通过邻接表枚举每一个这个颜色的点然后把他两边的颜色合并起来看答案是否减少,下面负责的是将颜色修改之后的子树较小的颜色给并到子树比较大的,然后把映射的头部,就是 $head$ 修改了, 如果你在一开始就去修改 $color_j = y$ ,就会导致你在往下枚举的时候,就像是你枚举到了这个点,你把这个点修改了,再去看下一个点,假如有相邻的两个点,我演示一下: ``` 1 1 1 2 1 1 1 ``` 如果你要把 $1 \rightarrow 2$,这样你就会先: ``` 1->2 1 1 2 1 1 1 ``` ``` 2 1->2 1 2 1 1 1 ``` 这个时候第二个左边本来是 $1$,右边是 $1$,你这样一下就变成了按照左边是 $2$ ,右边是 $1$ 来修改了,所以这个是先把答案更新之后回过头再把所有的颜色对应的块一顿修改。
by B612Dusk @ 2023-09-21 15:46:21


|