bzoj 4811: [Ynoi2017]由乃的OJ
树链剖分,用zkw线段树维护每条链两个方向上对每一位的变换情况,由于位数较少,可以用两个unsigned long long表示
#include<cstdio>
typedef unsigned long long u64;
const int N=;
char buf[N*],*ptr=buf-;
int _(){
int x=,c=*++ptr;
while(c<)c=*++ptr;
while(c>)x=x*+c-,c=*++ptr;
return x;
}
u64 _u64(){
u64 x=;
int c=*++ptr;
while(c<)c=*++ptr;
while(c>)x=x*+c-,c=*++ptr;
return x;
}
int es[N*],enx[N*],e0[N],ep=,tp[N];
u64 v[N];
int fa[N],sz[N],top[N],dep[N],son[N],id[N],idp=,idr[N];
int n,m,k;
u64 vs[][];
void f1(int w,int pa){
dep[w]=dep[fa[w]=pa]+;
sz[w]=;
for(int i=e0[w];i;i=enx[i]){
int u=es[i];
if(u!=pa){
f1(u,w);
sz[w]+=sz[u];
if(sz[u]>sz[son[w]])son[w]=u;
}
}
}
void f2(int w,int tp){
top[w]=tp;
id[w]=++idp;
idr[idp]=w;
if(son[w])f2(son[w],tp);
for(int i=e0[w];i;i=enx[i]){
int u=es[i];
if(u!=fa[w]&&u!=son[w])f2(u,u);
}
}
int s1[],p1,s2[],p2,s3[],s4[],p3,p4;
void find(int l,int r,int tp){
p1=p2=;
for(l+=,r+=;r-l!=;l>>=,r>>=){
if(~l&)s1[p1++]=l^;
if(r&)s2[p2++]=r^;
}
if(!tp){
for(int i=;i<p2;++i)s4[p4++]=s2[i];
while(p1)s4[p4++]=s1[--p1];
}else{
for(int i=;i<p2;++i)s3[p3++]=s2[i];
while(p1)s3[p3++]=s1[--p1];
}
}
#define cal(a,b,c0,c1) (a)=((~(b)&(c0))|((b)&(c1)))
void init(int w,int tp,u64 v){
u64*a=vs[w];
if(tp==){
a[]=a[]=0ll&v;
a[]=a[]=-1ll&v;
}else if(tp==){
a[]=a[]=0ll|v;
a[]=a[]=-1ll|v;
}else if(tp==){
a[]=a[]=0ll^v;
a[]=a[]=-1ll^v;
}
}
void up(u64*a,u64*l,u64*r){
cal(a[],l[],r[],r[]);
cal(a[],l[],r[],r[]);
cal(a[],r[],l[],l[]);
cal(a[],r[],l[],l[]);
}
u64 _v0,_v1;
void get(int x,int y){
p3=p4=;
int a=top[x],b=top[y];
while(a!=b){
if(dep[a]>dep[b]){
find(id[a],id[x],);
x=fa[a],a=top[x];
}else{
find(id[b],id[y],);
y=fa[b],b=top[y];
}
}
if(dep[x]>dep[y]){
find(id[y],id[x],);
}else{
find(id[x],id[y],);
}
u64 v0=0ll,v1=-1ll;
for(int i=;i<p4;++i){
u64*a=vs[s4[i]];
cal(v0,v0,a[],a[]);
cal(v1,v1,a[],a[]);
}
while(p3){
u64*a=vs[s3[--p3]];
cal(v0,v0,a[],a[]);
cal(v1,v1,a[],a[]);
}
_v0=v0,_v1=v1;
}
int main(){
fread(buf,,sizeof(buf),stdin)[buf]=;
n=_();m=_();k=_();
for(int i=;i<=n;++i){
tp[i]=_();
v[i]=_u64();
}
for(int i=,a,b;i<n;++i){
a=_();b=_();
es[ep]=b;enx[ep]=e0[a];e0[a]=ep++;
es[ep]=a;enx[ep]=e0[b];e0[b]=ep++;
}
f1(,);f2(,);
for(int i=;i<=n;++i)init(id[i]+,tp[i],v[i]);
for(int i=;i;--i)up(vs[i],vs[i<<],vs[i<<|]);
for(int i=;i<m;++i){
int o=_(),x=_(),y=_();
u64 z=_u64();
if(o==){
get(x,y);
u64 r=,r0,r1;
for(int i=;i>=;--i)if((r|1llu<<i)<=z){
cal(r0,r,_v0,_v1);
cal(r1,(r|1llu<<i),_v0,_v1);
if(r0<r1)r|=1llu<<i;
}
cal(r0,r,_v0,_v1);
printf("%llu\n",r0);
}else{
init(id[x]+,tp[x]=y,v[x]=z);
for(int w=id[x]+>>;w!=;w>>=)up(vs[w],vs[w<<],vs[w<<^]);
}
}
return ;
}
bzoj 4811: [Ynoi2017]由乃的OJ的更多相关文章
- BZOJ 4811 [Ynoi2017]由乃的OJ ——Link-Cut Tree
直接维护按照顺序经过每一段,初始的1可以变成什么,初始为0可以变成什么. 然后答案就可以和起床困难综合征一样贪心处理了. 写起来并不好写. 发现交换左右子树之后答案会改变,GG 调了一天,最后还是T掉 ...
- bzoj 4811 由乃的OJ
bzoj 4811 由乃的OJ 考虑树链剖分. 树剖后用一颗线段树维护一段连续区间,类似于一个函数,各位上进入 \(0/1\) ,输出的数字分别是什么.注意到最多只有 \(64\) 位,可以用一个 \ ...
- 【BZOJ4811】[Ynoi2017]由乃的OJ 树链剖分+线段树
[BZOJ4811][Ynoi2017]由乃的OJ Description 由乃正在做她的OJ.现在她在处理OJ上的用户排名问题.OJ上注册了n个用户,编号为1-",一开始他们按照编号排名. ...
- BZOJ 3595: [Scoi2014]方伯伯的Oj SBT+可持久化Treap
3595: [Scoi2014]方伯伯的Oj Time Limit: 6 Sec Memory Limit: 256 MBSubmit: 102 Solved: 54[Submit][Status ...
- BZOJ4811 [Ynoi2017]由乃的OJ
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- 【bzoj4811】[Ynoi2017]由乃的OJ 树链剖分/LCT+贪心
Description 给你一个有n个点的树,每个点的包括一个位运算opt和一个权值x,位运算有&,l,^三种,分别用1,2,3表示. 每次询问包含三个数x,y,z,初始选定一个数v.然后v依 ...
- BZOJ 4810 [Ynoi2017]由乃的玉米田 (莫队 + bitset)
题目链接 BZOJ 4810 首先对询问离线, 莫队算法处理. 首先我们可以用bitset维护处当前区间中是否存在某个数. 对于询问1, 我们可以用 ((f >> q[i].x) &am ...
- bzoj4811 [Ynoi2017]由乃的OJ 树链剖分+位运算
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4811 因为位运算的结果有可合并性,所以可以树链剖分,线段树维护: 细节很多,特别要注意从左往 ...
- BZOJ 3595: [Scoi2014]方伯伯的Oj Splay + 动态裂点 + 卡常
Description 方伯伯正在做他的Oj.现在他在处理Oj上的用户排名问题. Oj上注册了n个用户,编号为1-”,一开始他们按照编号排名.方伯伯会按照心情对这些用户做以下四种操作,修改用户的排名和 ...
随机推荐
- MyBatis like函数使用注意事项
百分号后面必须要加上空格,不然会将后面的字符串全部都黏在一起,导致sql语句运行报错
- day 023-python 包
包 : 我 们创建的每个文件夹都可以被称之为包. 但是我们要注意, 在python2中规定.中包内必须存在 __init__.py文件. python3可有可无,但一般要求写上.创建包的目的不是为了 ...
- 2017.4.5 Strom
Strom是分布式实时计算系统,它对于实时计算的意义类似于hadoop对于批处理的意义.与Storm关系密切的语言:核心代码用clojure书写,实用程序用python开发,使用java开发拓扑. S ...
- 实验吧—Web——WP之 Forms
我们先打开解题链接: 做Web题的第一步就是查看网页源代码,当然,有些网页他不会让你点击右键,那么可以在地址栏里的地址前面加上:view-source: 当然也可以打开控制台F12 我们可以看到代码里 ...
- 《DSP using MATLAB》Problem 5.19
代码: function [X1k, X2k] = real2dft(x1, x2, N) %% --------------------------------------------------- ...
- 被卡住的2个问题:1.输入url不执行后台的java方法 2.改了jsp页面,再次请求还是以前的那个页面
1.问题 一个子项目,它的java代码都是打包到磁盘这个文件夹 D://commlib java代码改了之后,也是打包到这个文件夹里,刷新就可看见改了的. 要想子项目能运行,必须在主项目中从/com ...
- mac 打印机无法打印
每次打印word的时候都无法正常打印,提示嘀嘀响声. 文件->页面设置-> 纸张A4 即可
- MySQL--批量KILL连接
============================================== 使用SELECT INTO OUTFILE方式获取到要删除的连接ID并保存为文件,在通过SOURCE执行 ...
- 03基于python玩转人工智能最火框架之TensorFlow介绍
一句话介绍: Google开源的基于数据流图的科学计算库,适用于机器学习 不局限于机器学习,但目前被大多用于机器学习等. TensorFlow计算流图的概念图 Tensor在图中流动. TensorF ...
- 深入详解美团点评CAT跨语言服务监控(六)消息分析器与报表(一)
大众点评CAT微服务监控架构对于消息的具体处理,是由消息分析器完成的,消息分析器会轮训读取PeriodTask中队列的消息来处理,一共有12类消息分析器,处理后的结果就是生成各类报表. 消息分析器的构 ...