[Procedure #6] P7323 [WC2021] 括号路径

[Procedure #6] P7323 [WC2021] 括号路径

[Start]

我们可以每次选择在合法路径 \((x,y)\) 的两端分别扩展一个 \((\)\()\) 来扩展为一个新的点对,还可以通过拼接 \((x,c),(c,y)\) 来得到新的路径。先考虑 \(n=3000,k=1\) 的情况怎么做。我们如果把 \((x,y)\) 再拿来建图,

[Hint] 可达是双向的

??我之前不是否定了这一点吗,哦,我搞错了,确实是双向的,样例只算一次是因为点对是无序的。

那么之前那种连通块的想法就很好了,我就说,这么契合的思路不可能是错的。然后对于一个连通块,里面的一个点,我们求出 \(out(x)\) 表示从 \(x\) 开始最多能走多少条 \()\) 的边。或者说,我们只保留 \((\) 的边,如果两个点他们距离同一个连通块各有一条一样长的路径,那么这两点就是同一个连通块。

我们考虑最后的情况,我们把连通块缩点,如果一个点有两入度,那么显然这两个就会合成一个,总之最后所有点只剩一个入度,也就是最后成为若干链。但是是不是直接合并其实就可以了。。。

毕竟至多合并 \(n\) 次么。

[Finish]

我们 unordered_set 维护一个点的入点,采用启发式合并合并,加一个并查集即可。

不过好像还有一个颜色的机制来着。反正就是同颜色的入边才能合并,差不多,换成 umap 即可。

Thoughts Memo

思维:不够严谨,不小心否定了正确的结论。

代码能力:如何智慧地实现?本题必须抓住合并这一要素,用队列维护合并,map 中只存一个颜色的代表,而不是去找点,大幅减低实现难度。

posted @ 2025-08-21 10:11  haozexu  阅读(9)  评论(0)    收藏  举报