计蒜客----Tree(树链剖分、按位维护)

这是一篇关于如何使用树链剖分和按位维护技术解决树上点权按位或、按位与及异或和查询问题的博客。通过建立31棵线段树,每棵树维护对应位上1的数量,实现了对操作的高效处理。虽然时间复杂度较高,但这种方法能有效处理给定的三种操作。
摘要由CSDN通过智能技术生成

题目链接

题面:
在这里插入图片描述

题意:
给定一棵树,点有点权。
有以下三种操作:
(1)将 1 − − x 1--x 1x上面的所有的点的点权都 按位或上一个数 t t t
(2)将 1 − − x 1--x 1x上面的所有的点的点权都 按位与上一个数 t t t
(3)询问 1 − − x 1--x 1x上面所有数的异或和。

题解:
对于 1 − − x 1--x 1x的处理可以使用树剖处理。
对于每一位建立一棵线段树,总共是31棵线段树。线段树上维护区间中这一位为 1 的数的个数。
这样对数的处理就转化为了对每一位的单独处理。

对于某一位来说,
对于操作1,如果 t t t 的这一位为 0,那么相当于 1 − − x 1--x 1x 节点这一位的权值未变。如果 t t t 的这一位为 1,相当于 1 − − x 1--x 1x 节点的这一位的权值都变为 1。

对于操作2,如果 t t t 的这一位为 0,那么相当于 1 − − x 1--x 1x 节点这一位的权值都变为0。如果 t t t 的这一位为 1,相当于 1 − − x 1--x 1x 节点的这一位的权值未变。

对于操作3,只需要统计 1 − − x 1--x 1x 每一位的1的个数是奇数个还是偶数个即可。

时间复杂度 O ( 31 ∗ n ∗ l o g 2 n ) O(31*n*log^2n) O(31nlog2n),有点大。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<set>
#include<vector>
#define ll long long
#define llu unsigned ll
using namespace std;


char buffer[100001],*S,*T;
inline char Get_Char()
{
   
    if (S==T)
    {
   
        T=(S=buffer)+fread
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值