Skip to content

Commit

Permalink
update hangzhou g
Browse files Browse the repository at this point in the history
  • Loading branch information
triccsr committed Nov 13, 2024
1 parent f212146 commit eac1f65
Showing 1 changed file with 5 additions and 5 deletions.
10 changes: 5 additions & 5 deletions content/post/ICPC2024-Hangzhou/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ fyc写E时Dew看B。Dew抓我当小黄鸭,但我根本没听懂。Dew写B,AC

此时还剩80min。场上通过人数最多的是J,其次G,再次I。三人看J,但全无思路。

然后队友让我看G,我发现G是个只有码量的水题,于是与fyc大佬交流做法。fyc大佬认为无法在剩余时间内写完G。
然后队友让我看G,我发现G是个只有码量的水题,于是与fyc大佬交流做法。fyc大佬认为无法在剩余时间内写完G。(事实证明fyc大佬十分有远见)

于是接着三人看J,但谁也没想到$O(m\cdot 2^m)$的做法。寄。

Expand All @@ -118,15 +118,15 @@ $n\leq 2\times 10^5,1\leq k\leq 10^9$。2s,1024M

fyc大佬是对的,这东西看着简单,实际上细节很多,不好调。杭州站讲题人也说有的队一开场就去写G,写了5h也没写出来。

容易想到在dfs环上挂的子树时,对每个颜色维护一个栈,若栈的大小$\geq k$,则栈上的倒数第k个位置即为恰好经过k次该颜色的位置。否则需要上环,在环上走的步数可以通过需要走的圈数和余数计算。这样可以$O(1)$计算从当前位置经过某颜色k次的结束位置(包括走的圈数)。由于在dfs当前节点的某个儿子时,只会让儿子节点的颜色结束位置变近,其他颜色的结束位置不变,所以可以维护每个颜色的结束位置数组,暴力维护全局最小值,回溯时恢复状态
容易想到维护一个数组,代表从当前节点出发,经过某种颜色k次的结束位置和走过的圈数,这样就可以$O(1)$比较某两种颜色经过k次的先后顺序。在dfs环上挂的子树时,对每个颜色维护一个栈。若栈的大小$\geq k$,则栈上的倒数第k个位置即为恰好经过k次该颜色的位置。否则需要上环。这样可以$O(1)$计算从当前位置经过某颜色k次的结束位置以及在环上走的圈数。由于在dfs当前节点的某个儿子时,只会让儿子节点的颜色结束位置变近,其他颜色的结束位置不变,所以可以用一个变量记录全局最小值,回溯时恢复数组和最小值

但这样有个问题,对于环上挂着的不同子树,每种颜色在从不同树根出发的结束位置并不相同。~~所以我们需要数据结构维护不同树根的初始结束位置,吗?~~
但这样有个问题,对于环上挂着的不同子树,每种颜色在从不同树根出发的结束位置并不相同。~~所以我们需要数据结构维护不同树根的初始结束位置数组,吗?~~

一个巧妙的解决方式是把环延长一倍,然后拆出一条链出来,这样不影响答案,且只剩一个子树
官方题解给出了一个巧妙的解决方式。把环延长一倍,然后拆出一条链出来,这样不影响答案,且每个环只剩一个子树

由于该题目只需求最先经过k次的颜色,且只输出所有点答案的和,所以即使有很离谱的bug也能过样例。既然暴力好写,应该写个对拍。

巨丑的代码(实际上我没有破环为链):
巨丑的代码(我的实现方式没有延长环):

```cpp
#include <bits/stdc++.h>
Expand Down

0 comments on commit eac1f65

Please sign in to comment.