P5127-子异和【线段树,树链剖分,位运算】

正题

题目链接:https://www.luogu.org/problemnew/show/P5127


题目大意

定义一个序列的子异和为所有自己的异或和的和。
然后有点权的树,要求支持路径异或和路径求子异和。


解题思路

首先树链剖分是肯定的,然后我们考虑用哪个数据结构。
从每个位单独分析,一个长度为nnn的集合,然后cntxcnt_xcntx表示有多少数的二进制第xxx位为000
然后对于一个位可以贡献的答案是2cntx−1∗2n−cntx=2n−12^{cnt_x-1}*2^{n-cnt_x}=2^{n-1}2cntx12ncntx=2n1,但是若cntx==0cnt_x==0cntx==0时答案是0。
也就是每个位如果cntx≠0cnt_x\neq 0cntx̸=0那么就可以贡献2x∗2n−12^x*2^{n-1}2x2n1的答案。

其实我们发现区间或值为sum(or)sum(or)sum(or)那么答案就是2n−1∗sum(or)2^{n-1}*sum(or)2n1sum(or)

然后我们区间查询就可以用线段树搞了,我们考虑如何区间查询
我们依旧是每个位进行分析,若第xxx位为0那么保持不变,如果为1那么久等于∼sum(and)\sim sum(and)sum(and)

所以我们可以得出
sum(or)′=(sum(or)&∼a)∣(∼sum(and)&a)sum(or)'=(sum(or)\& \sim a)|(\sim sum(and)\&a)sum(or)=(sum(or)&a)(sum(and)&a)
然后我们多维护一个sum(and)sum(and)sum(and)
sum(and)′=(sum(and)&∼a)∣(∼sum(or)&a)sum(and)'=(sum(and)\& \sim a)|(\sim sum(or)\&a)sum(and)=(sum(and)&a)(sum(or)&a)
圆满解决该题


codecodecode

#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=201000,XJQ=1e9+7; 
struct Tree_node{ll l,r,sor,sand,lazy;
};
struct Edge_node{ll to,next;
}a[N*2];
ll tot,ls[N],n,m,w[N],cnt,pow[N];
ll id[N],siz[N],seg[N],son[N],top[N],dep[N],f[N];
struct Line_Cut_Tree{Tree_node t[N*4];ll ans,Dig;void build(ll x,ll l,ll r){t[x].l=l;t[x].r=r;if(l==r){t[x].sor=t[x].sand=w[id[l]];return;}ll mid=(l+r)/2;build(x*2,l,mid);build(x*2+1,mid+1,r);t[x].sor=t[x*2].sor|t[x*2+1].sor;t[x].sand=t[x*2].sand&t[x*2+1].sand;}void updata(ll x,ll w){ll sor=t[x].sor,sand=t[x].sand;t[x].sor=(sor&(~w))|((~sand)&w);t[x].sand=(sand&(~w))|((~sor)&w);t[x].lazy^=w;}void downdata(ll x){if(!t[x].lazy) return;updata(x*2,t[x].lazy);updata(x*2+1,t[x].lazy);t[x].lazy=0;}ll ask(ll x,ll l,ll r){if(t[x].l==l&&t[x].r==r)return t[x].sor;downdata(x);if(r<=t[x*2].r) return ask(x*2,l,r);if(l>=t[x*2+1].l) return ask(x*2+1,l,r);return ask(x*2,l,t[x*2].r)|ask(x*2+1,t[x*2+1].l,r);t[x].sor=t[x*2].sor|t[x*2+1].sor;t[x].sand=t[x*2].sand&t[x*2+1].sand;}void change(ll x,ll l,ll r,ll val){if(t[x].l==l&&t[x].r==r){updata(x,val);return;}downdata(x);if(r<=t[x*2].r) change(x*2,l,r,val);else if(l>=t[x*2+1].l) change(x*2+1,l,r,val);else change(x*2,l,t[x*2].r,val),change(x*2+1,t[x*2+1].l,r,val);t[x].sor=t[x*2].sor|t[x*2+1].sor;t[x].sand=t[x*2].sand&t[x*2+1].sand;}
}Tree;
void addl(ll x,ll y)
{a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;
}
void dfs(ll x,ll fa){siz[x]=1;f[x]=fa;dep[x]=dep[fa]+1;for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(y==fa) continue;dfs(y,x);siz[x]+=siz[y];if(siz[son[x]]<siz[y])son[x]=y;}
}
void dfs2(ll x,ll fa){seg[x]=++cnt;id[cnt]=x;if(son[x]){top[son[x]]=top[x];dfs2(son[x],x);}for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(y==fa||y==son[x]) continue;top[y]=y;dfs2(y,x);}
}
void push_change(ll x,ll y,ll z){while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]])swap(x,y);Tree.change(1,seg[top[x]],seg[x],z);x=f[top[x]];}if(dep[x]>dep[y]) swap(x,y);Tree.change(1,seg[x],seg[y],z);return;
}
ll push_ask(ll x,ll y){ll cnt=0,ans=0;while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]])swap(x,y);ans|=Tree.ask(1,seg[top[x]],seg[x]);cnt+=seg[x]-seg[top[x]]+1;x=f[top[x]];}if(dep[x]>dep[y]) swap(x,y);ans|=Tree.ask(1,seg[x],seg[y]);cnt+=seg[y]-seg[x]+1;return ans*pow[cnt-1]%XJQ;
}
int main()
{scanf("%lld%lld",&n,&m);for(ll i=1;i<n;i++){ll x,y;scanf("%lld%lld",&x,&y);addl(x,y);addl(y,x);}pow[0]=1;for(ll i=1;i<=n;i++)pow[i]=(pow[i-1]*2)%XJQ;for(ll i=1;i<=n;i++)scanf("%lld",&w[i]);dfs(1,0);top[1]=1;dfs2(1,0);Tree.build(1,1,n);for(ll i=1;i<=m;i++){ll ts,a,b,c;scanf("%lld%lld%lld",&ts,&a,&b);if(ts==1)printf("%lld\n",push_ask(a,b));elsescanf("%lld",&c),push_change(a,b,c);}
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322404.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

06-Mapper动态代理

Mppaer 动态代理 目录 创建 Mapper 工程定义接口的要求测试类Mapper 中参数传递单个参数多个参数param命名参数多个参数封装成 Map多个参数之 POJO参数处理源码分析之前我们一直都使用传统开发模式DAO&#xff0c;即定义接口&#xff0c;然后定义实现类。这个其实是较为繁琐的…

ASP.NET Core MVC中的 [Required]与[BindRequired]

在开发ASP.NET Core MVC应用程序时&#xff0c;需要对控制器中的模型校验数据有效性&#xff0c;元数据注释(Data Annotations)是一个完美的解决方案。元数据注释最典型例子是确保API的调用者提供了某个属性的值&#xff0c;在传统的ASP.NET MVC中使用的是RequiredAttribute特性…

ES集群管理

转载自 ES集群管理 8 集群管理 ES通常以集群方式工作&#xff0c;这样做不仅能够提高 ES的搜索能力还可以处理大数据搜索的能力&#xff0c;同时也增加了系统的容错能力及高可用&#xff0c;ES可以实现PB级数据的搜索。 下图是ES集群结构的示意图&#xff1a; 从上图总结以下…

【Java探索之旅】我与Java的初相识(完):注释,标识符,关键字

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; Java入门到精通 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. Java的注释方式二. 标识符三. 关键字四. 全篇总结 &#x1f4d1;前言 在Java编程…

P5290-[十二省联考2019]春节十二响【贪心,堆】

正题 题目链接:https://www.luogu.org/problemnew/show/P5290 题目大意 将一棵树的所有节点分城若干个组。每个组的价格是这个组中价格最大的点&#xff0c;要求这个组中没有任何祖孙关系。 求所有组的权值和最小。(1号为根节点) 解题思路 我们先想10,11,1210,11,1210,11,12…

07-MyBatis 核心配置文件

MyBatis 核心配置文件 目录 properties 定义属性及读取属性文件settings 设置运行时行为typeAliases 类型别名定义单个别名批量定义别名typeHandlers 类型处理器Plugins&#xff08;后续有文章专门介绍这个&#xff09;Environments 运行环境databaseIDProvider 定义数据库厂…

Office 365也是.NET Core应用开发新战场

最近有幸阅读了陈希章花了一年时间为国内开发者贡献的《Office 365 开发入门指南》。 虽然早期接触过SharePoint的开发&#xff0c;2007年之后就再也没有接触SharePoint的开发&#xff0c;这次阅读这本书让我重新认识了Office的系统开发技术&#xff0c;让我意识到现在的Office…

jzoj4802-[GDOI2017模拟9.24]探险计划【费用流,拆点】

正题 题目大意 一个nnn行的不完全矩阵第iii行有mi−1mi-1mi−1个格子&#xff0c;然后每个格子有危险度。 每次可以从(i,j)(i,j)(i,j)走到(i−1,j)(i-1,j)(i−1,j)或(i−1,j−1)(i-1,j-1)(i−1,j−1) 求 m次&#xff0c;每个格子和路不可以重复走的最小危险度。m次&#xff0…

Scala与Java差异(一)之基础语法

一、Scala解释器的使用 &#xff08;1&#xff09;REPL Read&#xff08;取值&#xff09;-> Evaluation&#xff08;求值&#xff09;-> Print&#xff08;打印&#xff09;-> Loop&#xff08;循环&#xff09;。 scala解释器也被称为REPL&#xff0c;会快速编译…

08-输出类型

输出类型 目录 输出简单类型输出 Map 类型key:列名 value:列名对应的值key:自己指定的列 value:自定义对象resultMap输出简单类型 CustomerMapper.java&#xff1a;返回值为简单类型。 public interface CustomerMapper {/*查询总数*/public Integer getAccountCustomer();…

在Ubuntu 16.04环境下安装Docker-CE(附视频教程)

“ 任何的课程都逃不开理论的支持”久等了各位&#xff0c;上一篇说Docker开始的消息已经过去了一周多的时间&#xff0c;今天推送的消息是告诉大家视频可以学习了&#xff01;52ABP .NET CORE QQ群 : 633751348大纲Docker的介绍Ubuntu下安装Docker快速体验Docker利用Docker搭…

jzoj4800-[GDOI2017模拟9.24]周末晚会【dp,循环重构】

正题 题目大意 nnn个人的圆桌&#xff0c;可以放男可以放女&#xff0c;然后要求不能有连续kkk个女生坐在一起。求方案总数。 解题思路 先不考虑圆桌&#xff0c;设fi,jf_{i,j}fi,j​表示放了i个人&#xff0c;最前面有连续jjj个女生&#xff0c;动态转移方程显然 fi,jfi−1,j…

Scala与Java差异(二)之条件控制与循环

一、if表达式 &#xff08;1&#xff09;if表达式的定义 在Scala中&#xff0c;if表达式是有值的&#xff0c;就是if或者else中最后一行语句返回的值。 例如&#xff0c;val age 30; if (age > 18) 1 else 0 可以将if表达式赋予一个变量&#xff0c;例如&#xff0c;va…

WebApi client 的面向切面编程

.Net的面向切面编程.Net的服务端应用AOP很常见&#xff0c;在Asp.net MVC与Asp.net WebApi等新框架里到处都有AOP的影子&#xff0c;我们可以把一个服务方法“切”为很多面&#xff0c;日志面、验证面、请求方式处理、接口业务实现等多个面&#xff0c;有一些面可以使用过滤器特…

09-一对多关系建表

多表操作 目录 表之间关系一对多关系建表原则表之间关系 一对一关系&#xff1a;一夫一妻。 一对多关系&#xff1a; 一个部门有多个员工&#xff0c;一个员工只能属于某一个部门。 一个班级有多个学生&#xff0c;一个学生只能属于一个班级。 多对多关系&#xff1a; 一个…

jzoj6191-[NOI2019模拟2019.5.31]Exchange【线段树】

正题 题目大意 一个序列&#xff0c;给定若干个区间[l..r][l..r][l..r] 从l∼rl\sim rl∼r任意一个位置出发&#xff0c;见到比手中大的数字就交换&#xff0c;到rrr求最小的交换次数 (注意&#xff0c;并不是真的交换) 解题思路 首先算出每个点的后继(在它后面第一个比他大的…

面试阿里挂了却拿到网易、点我达offer,一个三年经验Java程序员的面试总结

转载自 面试阿里挂了却拿到网易、点我达offer&#xff0c;一个三年经验Java程序员的面试总结 前言 15年毕业到现在有三年多了&#xff0c;最近去面试了阿里集团&#xff08;菜鸟网络&#xff0c;蚂蚁金服&#xff09;、网易、滴滴、点我达&#xff0c;最终收到点我达、网易o…

10-多对一左连接查询分步查询(查询所有订单及订单对应的客户)

左连接查询&#xff08;级联查询&#xff09; 回顾一下&#xff1a;左连接查询&#xff0c;将左边表(order)里的全部内容查出&#xff0c;右边表(customer)查满足条件的。 SELECT * FROM order AS o LEFT JOIN customer AS c on o.cust_id c.cust_id;1那么在 MyBatis 中如何…

入门干货之Grpc的.Net 封装-MagicOnion

0x01、Grpc1、介绍Google主导开发的RPC框架&#xff0c;使用HTTP/2协议并用ProtoBuf作为序列化工具&#xff0c;支持多种语言。在.NET Core “大更新” 之前&#xff0c;也就是目前来说还算是个很不错的选择。2、吐槽a、有很多性能比较的文章拿Grpc开涮.b、搭建困难&#xff0c…

欢乐纪中A组周六赛【2019.6.1】

前言 六一儿童节快乐(然而我还在学校) dalao都走了&#xff0c;导致只剩下我们这帮菜鸡在被虐 成绩 JJJ表示初中&#xff0c;HHH表示高中后面加的是几年级 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC111(J−2)ZYC(J-2)ZYC(J−2)ZYC1301301303030301001001000002…