【LGP5127】子异和
子异和这个名字,真是思博
显然一个集合的子集异或和为,\(2^{|S|-1}\times A\),\(A\)为集合的或和
于是现在的问题变成了树链异或一个数,求树链或和
显然强行拆位是可以做的,复杂度\(O(n\log n\ \log mod)\),还是\(\rm lct\)于是直接飞了
通过一番玄妙重重的推理,我们发现,整体异或上\(c\),对或和的影响是
\]
这样我们还需要维护与和
\]
直接\(\rm lct\)维护即可,注意维护与和的时候记得判断当左右儿子为空时就不要取与了
代码
#include<bits/stdc++.h>
#define re register
#define LL long long
const int mod=1e9+7;
const int maxn=2e5+5;
#pragma GCC optimize(3)
#pragma GCC optimize("-fcse-skip-blocks")
inline int read() {
char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
unsigned int v[2][maxn],s[2],tag[maxn];
int ch[maxn][2],fa[maxn],sz[maxn],rev[maxn],st[maxn],a[maxn];
int xx[maxn],yy[maxn],pw[maxn],n,Q;
inline int nrt(int x) {return x==ch[fa[x]][0]||x==ch[fa[x]][1];}
inline void pushup(int x) {
sz[x]=1+sz[ch[x][0]]+sz[ch[x][1]];
v[1][x]=v[0][x]=a[x];
v[0][x]|=(v[0][ch[x][0]]|v[0][ch[x][1]]);
if(ch[x][0]) v[1][x]=(v[1][x]&v[1][ch[x][0]]);
if(ch[x][1]) v[1][x]=(v[1][x]&v[1][ch[x][1]]);
}
inline void calc(int x,unsigned int c) {
if(!x) return;
a[x]^=c,tag[x]^=c;
s[0]=v[0][x],s[1]=v[1][x];
v[0][x]=(s[0]&~c)|(c&~s[1]);
v[1][x]=(s[1]&~c)|(c&~s[0]);
}
inline void pushdown(int x) {
if(tag[x]) {
calc(ch[x][0],tag[x]),calc(ch[x][1],tag[x]);
tag[x]=0;
}
if(rev[x]) {
rev[x]=0,rev[ch[x][0]]^=1;rev[ch[x][1]]^=1;
std::swap(ch[ch[x][0]][0],ch[ch[x][0]][1]);
std::swap(ch[ch[x][1]][0],ch[ch[x][1]][1]);
}
}
inline void rotate(int x) {
int y=fa[x],z=fa[y],k=ch[y][1]==x,w=ch[x][k^1];
if(nrt(y)) ch[z][ch[z][1]==y]=x;
ch[x][k^1]=y,ch[y][k]=w;
pushup(y),pushup(x);fa[w]=y,fa[y]=x,fa[x]=z;
}
inline void splay(int x) {
int y=x,top=0;st[++top]=x;
while(nrt(y)) y=fa[y],st[++top]=y;
while(top) pushdown(st[top--]);
while(nrt(x)) {
int y=fa[x];
if(nrt(y)) rotate((ch[y][1]==x)^(ch[fa[y]][1]==y)?x:y);
rotate(x);
}
}
inline void access(int x) {
for(re int y=0;x;y=x,x=fa[x])
splay(x),ch[x][1]=y,pushup(x);
}
inline void mrt(int x) {
access(x),splay(x),rev[x]^=1;std::swap(ch[x][0],ch[x][1]);
}
inline void split(int x,int y) {
mrt(x),access(y),splay(y);
}
inline void link(int x,int y) {
mrt(x),fa[x]=y;
}
int main() {
n=read();Q=read();
for(re int i=1;i<n;i++) xx[i]=read(),yy[i]=read();
for(re int i=1;i<=n;i++) a[i]=read(),sz[i]=1;
for(re int i=1;i<n;i++) link(xx[i],yy[i]);
pw[0]=1;int x,y,op;unsigned int c;
for(re int i=1;i<=n;++i) pw[i]=(pw[i-1]+pw[i-1])%mod;
while(Q--) {
op=read();x=read(),y=read();split(x,y);
if(op==1) printf("%d\n",1ll*v[0][y]%mod*pw[sz[y]-1]%mod);
else c=read(),calc(y,c);
}
return 0;
}
【LGP5127】子异和的更多相关文章
- 【转】Spring事务管理
原文链接 在 Spring 中,事务是通过 TransactionDefinition 接口来定义的.该接口包含与事务属性有关的方法.具体如清单 1 所示: 清单 1. TransactionDefi ...
- 从源码看全局异常处理器@ExceptionHandler&@ExceptionHandler的生效原理
1.开头在前 日常开发中,几乎我们的项目都会用到异常处理器,我们通常会定制属于自己的异常处理器,来处理项目中大大小小.各种各样的异常.配置异常处理器目前最常用的方式应该是使用@ControllerAd ...
- 机器学习——支持向量机(SVM)之拉格朗日乘子法,KKT条件以及简化版SMO算法分析
SVM有很多实现,现在只关注其中最流行的一种实现,即序列最小优化(Sequential Minimal Optimization,SMO)算法,然后介绍如何使用一种核函数(kernel)的方式将SVM ...
- Java的位运算符详解实例——与(&)、非(~)、或(|)、异或(^)
位运算符主要针对二进制,它包括了:“与”.“非”.“或”.“异或”.从表面上看似乎有点像逻辑运算符,但逻辑运算符是针对两个关系运算符来进行逻辑运算,而位运算符主要针对两个二进制数的位进行逻辑运算.下面 ...
- BRIEF 特征描述子
Binary Robust Independent Elementary Features www.cnblogs.com/ronny 1. BRIEF的基本原理 我们已经知道SIFT特征采用了128 ...
- 《Xenogears》(异度装甲)隐含的原型与密码
<Xenogears>(异度装甲)隐含的原型与密码 X 彩虹按:一种高次元的“生命体”,因“事故”被抓来当成“超能源”,其实那不只是“无限的能源”而已,“它”是有意志的!在我们眼里看来,这 ...
- [改善Java代码]数组的真实类型必须是泛型类型的子类型
List接口的toArray方法可以把一个结合转化为数组,但是使用不方便,toArray()方法返回的是一个Object数组,所以需要自行转变. toArray(T[] a)虽然返回的是T类型的数组, ...
- HJA的异或值
HJA的异或值 查看 提交 统计 提问 总时间限制: 20000ms 内存限制: 512000kB 描述 形态形成场(Morphogenetic Field)假说是Rupert Sheldrake ...
- [每日一题] OCP1z0-047 :2013-07-24 子查询――外查询与内查询的执行顺序
一.Oracle的子查询分为两类分别是嵌套子查询和非嵌套子查询.所谓嵌套子查询是指,子查询是一个独立的查询不与外部查询相关,子查询将被先执行,而且只被执行一次,子查询执行完成后,再执行外部的查询,外部 ...
随机推荐
- 1. USB协议
1.1 Packets USB总线上数据传输以包为基本单位,一个包含不同的域,但都要从同步域开始,然后跟踪一个包标识符PID(Packet Identifier),最终以包结束符EOP(End of ...
- HDU 6693 Valentine's Day (概率)
2019 杭电多校 10 1003 题目链接:HDU 6693 比赛链接:2019 Multi-University Training Contest 10 Problem Description O ...
- hibernate 中createQuery与createSQLQuery两者区别
hibernate 中createQuery与createSQLQuery两者区别是:前者用的hql语句进行查询,后者可以用sql语句查询前者以hibernate生成的Bean为对象装入list返回, ...
- 在命令行中运行Hadoop自带的WordCount程序
1.启动所有的线程服务 start-all.sh 记得要查看线程是否启动 jps 2.在根目录创建 wordcount.txt 文件 放置一些数据 3.创建 hdfs dfs -mkdir /文件夹 ...
- chrony实现局域网时间同步
chrony基于cs架构实现,配置一台服务主机与其他客户主机即可 服务端 #yum install chrony --RHEL7默认已安装chrony,而没有安装ntpd. #systemctl st ...
- linux 上挂载硬盘或者读取u盘数据
查看服务器上有哪些设备 df -hl查询挂载 硬盘后或者插上u盘后sda 的变化,新增的就是我们添加上的. fdisk -ls /dev/sda
- ThinkPHP5实用的数据库操作方法
1.update方法总结 /** * 设置记录的某个字段值 * 支持使用数据库字段和方法 * @access public * @param string|array $field 字段名 * @pa ...
- PCA降维-最大,最小方差解释
转自http://www.cnblogs.com/jerrylead/archive/2011/04/18/2020209.html http://www.cnblogs.com/jerrylead/ ...
- Pandaria(Kruskal重构树+线段树合并)
题意 是 有n个花园 一个花园内所有的花的颜色都是一样的 有很多种不同的颜色 花园到花园之间有路,走不同的路有不同的代价 如果选一个点作为起点 只走小于等于w的路 可以经过的这些花园里 那种 ...
- POJ 3259 Wormholes Bellman题解
版权声明:本文作者靖心,靖空间地址:http://blog.csdn.net/kenden23/.未经本作者同意不得转载. https://blog.csdn.net/kenden23/article ...