题解:
将同色的布丁用链表保存,并统计出一开始的答案Ans = ∑ord(a[i] <> a[i – 1]) 对于变色操作(x,y),若链x长于链y则交换x,y且以后遇到x时要替换成y,遇到y时替换成x 然后扫描链x,从Ans中减去与x有关的部分,再次扫描将其颜色改成y,再次扫描给Ans中加上与其有关的部分,最后将链表x接在链表y上即可。对于询问操作直接输出Ans即可
这篇题解是mt留下来的,精炼而直切要点~~
多说一点,关于这个算法的复杂度,每次操作是均摊O(logn)的
证明的话,可以这样想,由于是将小的并到大的里头去,所以最麻烦的情形就是合并两个等长的链表,也就是说,对于每一个布丁,每对他操作一次就会使它所在的链表长度*2,那么最多对每个点操作O(logn)次,也就是每次操作均摊O(logn),所以整个算法的复杂度就是O(mlogn)了
附代码:
其实一开始我nc地自己yy了一个“启发式合并”,在保证链表有序的情况下,将小的合并到大的里头去。。
结果自然是一顿乱超时
这才发现好像每次去遍历那个较长的链表就直接TLE了,再一想才发现我根本没必要保证链表有序!
哎,我又蠢了