8.15练习小节

发布时间 2023-08-16 11:02:35作者: 铃狐sama

8/15练习总结

总体上:

整体有点自闭,用太多时间在第一题上面了,小悲伤

个体上:

第一题:

用了1.5h,但好在最后打出来了,以后可以先暴力,然后算复杂度,然后再优化想新的方案

第二题:

没有看题,感觉有点难就跳过了。
看了题解,未曾设想的道路,竟然是压缩这种感觉......

第三题:

最开始思路是很正确的——维护某条路径上走过id有多少次以及长度,但是开数组a[x][id]表示在i点处j的颜色的贡献,会MLE
而且呢,因为继承原因,每次要n的时间把父亲节点的复制到子节点,这样花费n时间,n方会超。

但是实现给卡住了,如果在线的话,树剖忘记怎么打了,所以很悲伤,有思路但只能部分分
那就多多复习下树剖吧......

离线思想更新

欸,我看了下,好像离线可以做,具体思路是这样的:
我可以统计出每个询问他需要的颜色,顶点(u,v,lca),显然这三个我都需要求在这种颜色下的经过此颜色边的次数以及长度。
于是我对某个顶点x绑询问信息:(i,col),表示我要在顶点x查询第i组询问有关col颜色的所有信息。
但是所有信息,我必须要具体知道在i组询问中,x这个点是u吗,是v吗,还是lca。(毕竟lca是减去两次计算,但是u,v是加上,不一样)
因此捆绑(i,col,1/2/3),1/2/3分别代表我要查询的目标。

然后我像类似回溯一样,用colcs[x]和coldis[x]分别表示到某个定点时x颜色出现的次数,总共的长度。
转移和回溯都是O(1)的,因为我已经知道一条边的颜色了,所以转移时的颜色是确定的,而其他颜色不会变。
如果我遇到了有查询的点,我把此时的colcs[x]和coldis[x]记录下来即可,然后根据1/2/3放到i组的答案中
好写,思路也确实挺不错的。

总共算下来,是O(n+q)的算法,非常不错了。

第四题:

看了题,但暴力都有问题,小悲伤