【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的子查询分为两类分别是嵌套子查询和非嵌套子查询.所谓嵌套子查询是指,子查询是一个独立的查询不与外部查询相关,子查询将被先执行,而且只被执行一次,子查询执行完成后,再执行外部的查询,外部 ...
随机推荐
- python pandas 使用列表快速创建数据 用于测试
创建数据和行append数据 >>> df = pd.DataFrame([['AA', 1.00], ['Ks', 2.00]], columns=['name', 'age']) ...
- pandas中读取文件报错
import pandas as pd fileName = "路径中带有中文/xxx.csv" tf_train = pd.read_csv(fileName) 会提示报错 OS ...
- css过滤镜实现颜色渐变
语法:filter : progid:DXImageTransform.Microsoft.Gradient ( enabled=bEnabled , startColorStr=iWidth , e ...
- Stack,ArrayDeque,LinkedList的区别
本文首发于cartoon的博客 转载请注明出处:https://cartoonyu.github.io/cartoon-blog 这段时间把疯狂JAVA再看了一遍,发现Stac ...
- 用python+tushare获取股票前复权后复权行情数据
接口名称 :pro_bar 接口说明 :复权行情通过通用行情接口实现,利用Tushare Pro提供的复权因子进行计算,目前暂时只在SDK中提供支持,http方式无法调取. Python SDK版本要 ...
- C#跨线程访问(一) ---- SynchronizationContext
一.SynchronizationContext顾名思义是同步上下文的意思.利用此对象可以实现线程间数据的同步.异步访问. 二.例子 class Program { static Thread _wo ...
- 2018-2-13-win10-uwp-如何拖动一个TextBlock的文字到另一个TextBlock-
title author date CreateTime categories win10 uwp 如何拖动一个TextBlock的文字到另一个TextBlock lindexi 2018-2-13 ...
- centos7.x部署php7.0、mysql
1.安装httpd yum install httpd systemctl start httpd.service #启动命令 systemctl stop httpd.service #停止命令 s ...
- Webstorm 、ECMAScript 6 、AngularJS
突然接到一智障询问以上内容,大发善心总结(其实就是CV大法)一下下,希望能帮助某智障.....上干活! WebStorm 刚看到我是懵逼的,但是看到和其他两个在一起,猜想到是前台的一开始以为是前台框架 ...
- leetcode-168周赛-1295-统计位数为偶数的数字
题目描述: 方法一:O(N) class Solution: def findNumbers(self, nums: List[int]) -> int: ans=0 for num in nu ...