杨威利与莱因哈特的爱恨情仇
蒟蒻Sulfur6在第一次看见这道题的时候感觉它好水啊,然后五分钟打了个自以为是的正解。。肯定是错的太离谱了,那天晚上的代码带崩了我的三个系统。。。
刚刚学习并查集的时候就见过那个题,当时连最水的家族都做不出,真的是连题面都没看就跳过去了。
题目大意
给定一个最多有30000艘船的船队,初始状态一字排开。 接下来你要读入 个指令 (): 若为,则将所在的舰队移动到所在舰队的后面(即将第艘舰船所在的战舰队列全部移动到第列舰船所在战舰队列的后面); 若为,如果第艘舰船在同一列中,则输出它们中间有的舰船数,如果不在同一列中,则输出。
这里要注意的是(可能只有我一个人这么智障),就是给定合并操作的可能只是一列舰船中间或末尾的那个,不一定就是某列舰船的第一个。【天真的以为一定给定第一艘的蒟蒻就这么WA挺了。
压缩路径
- 分析完题目大意之后我们会自然而然的想到一种做法,那就是记录每一列舰船所在的位置
- 但是这样显然不靠谱,因为不路径压缩的UFS会爆炸。
- 怎么在压缩路径的基础上维护战舰所在位置的信息呢?
某优化
如果说大家和我一样记得并查集路径压缩的代码的话,我们会发现,在路径压缩之前并没有维护什么信息,所以我们尝试着来搞一些事情
|
完整代码
|
看这个难度也知道是NOI的一道水题,毕竟我这样的蒟蒻都能A。。 当年看着唐氏Pascal学并查集就死活学不会了,思想都不懂,这里要感谢教会我并查集的神犇Menci和Gty.
Author: Sulfur6
Origin: http://sulfur6.github.io
Link: http://sulfur6.github.io/ywl/
本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可