【HNOI2009 梦幻布丁】链表+启发式合并

题解:

将同色的布丁用链表保存,并统计出一开始的答案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了,再一想才发现我根本没必要保证链表有序!

哎,我又蠢了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值