2021牛客暑期多校训练营4

TreeXor

https://ac.nowcoder.com/acm/problem/224148

#E 题意:给定一颗由n个点组成的树,第i个点的的权值图片说明 ,同时给定所有边权,边权为两个点的异或值,求有多少中满足要求的点权组合。 思路:当任意一个点的权值确定后,所有的点的权值也就通过边权间接唯一求出。 不妨设a[1]=0 ,进而推出所有点的权值,当a[1]=x 时,a'[i] , 又因为a'[i]的范围 可以推导出x的范围 。所以问题就是求有几个x满足题意。 如何解决这个问题,让我们请出Kur1su。 我们把求x的问题考虑成有多少点被覆盖了n次。因为点有很多个,我们把它们看成区间**[a,b]。每次覆盖的时候就给a打上一个1标记,给b+1打上一个-1标记。对于区间[0,a-1]这一段的标记是0**,[a,b]1[b+1,inf]又为0。如此一来我们可以把覆盖区间**[a,b]转换成对给区间[1,a-1]打上-1标记,[1,b]打上1**标记。

对于1,l_{i} 我们先打**-1标记,后打1标记,反之,对于另一部分,先打1标记,后打-1标记。我们按位搜索,一共四种情况,00,01,10,11前面是a[i],后面是l[i]-1或者r[i]。 当是00时,我们目前已经有0**,实际也需要0,0^0=0,我们可以知道现在的前缀大小不会发生改变,也不会有区间被覆盖。 当是01时,我们目前已经有0,实际也需要1,0^1=1,我们可以知道现在的前缀大小会加上2^pos,区间[now , now+(1<<pos) - 1]被覆盖。 当是10时,我们目前已经有1,实际也需要0,1^0=1,我们可以知道现在的前缀大小会加上2^pos,但是却没有区间被覆盖。 当是11时,我们目前已经有1,实际也需要1,1^1=0,我们可以知道现在的前缀大小不变,区间[now+(1<<pos) , now+( 1<<(pos+1) )-1]被覆盖。 最后就是简单计数。

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=48638209&returnHomeType=1&uid=467843024

写在最后:感觉没能彻底理解,锁了。

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-15 17:32
点赞 评论 收藏
分享
05-29 09:02
门头沟学院 Java
点赞 评论 收藏
分享
陆续:不可思议 竟然没那就话 那就我来吧 :你是我在牛客见到的最美的女孩
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务