BZOJ4811 [Ynoi2017]由乃的OJ

博客介绍了如何利用LCT(线段树的链剖分解)和链剖解决Ynoi2017中的题目,通过维护v0和v1变量来消除k的影响,实现信息的合并。尽管LCT方法的时间复杂度为n log n * k,导致超时,但链剖方法在3秒内成功通过。
摘要由CSDN通过智能技术生成

显然用LCT维护一下经过一条链之后每一位原来是1会变成什么原来是0会变成什么即可

这样的话LCT复杂度是n log n * k的,链剖是n log^2 n * k的,都过不了

考虑把这个k给去掉,我们直接开两个unsigned long long,v0和v1,v0的每一位代表这一位原来是0的话经过这条链会变成什么,v1的每一位代表这一位原来是1的话经过这条链会变成什么

那么考虑信息的合并,假如你现在知道了v0[x],v1[x],v0[y],v1[y],先经过x后经过y,那么合并之后新的v0=(v0[x]&v1[y])|(~v0[x]&v0[y]),v1=(v1[x]&v1[y])|(~v1[x]&v0[y])

比较好理解吧……就是比如v0,原来的0变成1那些位就会变成v1[y]中对应的位,变成0的那些位会变成v0[y]中对应的位,那么与一下,然后合起来就好了

链剖和LCT我都写了,结果LCT TLE了,链剖3s过了

#include<iostream>
#include<cs
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值