如果做过起床困难综合征的话应该很快就能有思路,没做过那道题的话还真是挺费劲的.

我们不知道要带入的值是什么,但是我们可以知道假设带入值得当前位为 $1$ 时这一位在经过位运算后是否为 $1$.

至于这个怎么维护,我们开两个变量 $f0,f1$ 代表初始带入全 $0$,全 $1$ 时每一位得值.

然后在 $LCT$ 中维护从左向右,从右向左两个方向上得这个东西,注意一下 $pushup$ 函数得写法.

这段代码十分优美,利用了按位取反等骚操作:

struct node
{
ll f0,f1;
node operator+(const node &b) const
{
node a;
a.f0=(~f0&b.f0)|(f0&b.f1);
a.f1=(~f1&b.f0)|(f1&b.f1);
return a;
}
}f[N],L[N],R[N];

code:

#include <bits/stdc++.h>
#define N 100007
#define ll unsigned long long
#define setIO(s) freopen(s".in","r",stdin) ,freopen(s".out","w",stdout)
using namespace std;
int n,m,k,edges;
int hd[N],to[N<<1],nex[N<<1];
void addedge(int u,int v)
{
nex[++edges]=hd[u],hd[u]=edges,to[edges]=v;
}
struct node
{
ll f0,f1;
node operator+(const node &b) const
{
node a;
a.f0=(~f0&b.f0)|(f0&b.f1);
a.f1=(~f1&b.f0)|(f1&b.f1);
return a;
}
}f[N],L[N],R[N];
struct Link_Cut_Tree
{
#define lson p[x].ch[0]
#define rson p[x].ch[1]
int sta[N];
struct Node
{
int ch[2],f,rev;
}p[N];
int get(int x)
{
return p[p[x].f].ch[1]==x;
}
int isrt(int x)
{
return !(p[p[x].f].ch[0]==x||p[p[x].f].ch[1]==x);
}
void pushup(int x)
{
L[x]=R[x]=f[x];
if(lson) L[x]=L[lson]+L[x], R[x]=R[x]+R[lson];
if(rson) L[x]=L[x]+L[rson], R[x]=R[rson]+R[x];
}
void rotate(int x)
{
int old=p[x].f,fold=p[old].f,which=get(x);
if(!isrt(old)) p[fold].ch[p[fold].ch[1]==old]=x;
p[old].ch[which]=p[x].ch[which^1],p[p[old].ch[which]].f=old;
p[x].ch[which^1]=old,p[old].f=x,p[x].f=fold;
pushup(old),pushup(x);
}
void mark(int x)
{
if(!x) return;
swap(lson,rson), swap(L[x],R[x]),p[x].rev^=1;
}
void pushdown(int x)
{
if(p[x].rev)
{
p[x].rev=0;
if(lson) mark(lson);
if(rson) mark(rson);
}
}
void splay(int x)
{
int u=x,v=0,fa;
for(sta[++v]=u;!isrt(u);u=p[u].f) sta[++v]=p[u].f;
for(;v;--v) pushdown(sta[v]);
for(u=p[u].f;(fa=p[x].f)!=u;rotate(x))
if(p[fa].f!=u)
rotate(get(fa)==get(x)?fa:x);
}
void Access(int x)
{
for(int y=0;x;y=x,x=p[x].f)
{
splay(x);
rson=y;
pushup(x);
}
}
void makeroot(int x)
{
Access(x),splay(x),mark(x);
}
void split(int x,int y)
{
makeroot(x), Access(y), splay(y);
}
void link(int x,int y)
{
makeroot(x), p[x].f=y;
}
void cut(int x,int y)
{
makeroot(x),Access(y),splay(y);
p[y].ch[0]=p[x].f=0;
pushup(y);
}
#undef lson
#undef rson
}lct;
void solve(int x,int y,ll z)
{
lct.split(x,y);
int i;
ll re=0;
for(i=k-1;i>=0;--i)
{
if(L[y].f0&(1ll<<i)) re+=(1ll<<i);
else if((L[y].f1&(1ll<<i)) && (1ll<<i)<=z) re+=(1ll<<i), z-=(1ll<<i);
}
printf("%llu\n",re);
}
void dfs(int u,int ff)
{
lct.p[u].f=ff;
for(int i=hd[u];i;i=nex[i])
if(to[i]!=ff) dfs(to[i],u);
}
int main()
{
int i,j;
// setIO("input");
scanf("%d%d%d",&n,&m,&k);
for(i=1;i<=n;++i)
{
int op;
ll y;
scanf("%d%llu",&op,&y);
if(op==1) f[i]=(node){0ll,y};
if(op==2) f[i]=(node){y,~0ll};
if(op==3) f[i]=(node){y,~y};
lct.pushup(i);
}
for(i=1;i<n;++i)
{
int u,v;
scanf("%d%d",&u,&v),addedge(u,v),addedge(v,u);
}
dfs(1,0);
for(i=1;i<=m;++i)
{
int op;
scanf("%d",&op);
if(op==1)
{
int x,y;
ll z;
scanf("%d%d%llu",&x,&y,&z);
solve(x,y,z);
}
else
{
int x,y;
ll z;
scanf("%d%d%llu",&x,&y,&z);
lct.Access(x);
lct.splay(x);
if(y==1) f[x]=(node){0ll,z};
if(y==2) f[x]=(node){z,~0ll};
if(y==3) f[x]=(node){z,~z};
lct.pushup(x);
}
}
return 0;
}

  

luogu 5354 [Ynoi2017]由乃的OJ LCT+位运算的更多相关文章

  1. Libre 6009 「网络流 24 题」软件补丁 / Luogu 2761 软件安装问题 (最短路径,位运算)

    Libre 6009 「网络流 24 题」软件补丁 / Luogu 2761 软件安装问题 (最短路径,位运算) Description T 公司发现其研制的一个软件中有 n 个错误,随即为该软件发放 ...

  2. P3613 睡觉困难综合征(LCT + 位运算)

    题意 NOI2014 起床困难综合症 放在树上,加上单点修改与链上查询. 题解 类似于原题,我们只需要求出 \(0\) 和 \(2^{k - 1} - 1\) 走过这条链会变成什么值,就能确定每一位为 ...

  3. Luogu P5354 [Ynoi2017]由乃的OJ

    题目 这题以前叫睡觉困难综合征. 首先我们需要知道起床困难综合征怎么做. 大概就是先用一个全\(0\)和全\(1\)的变量跑一遍处理出每一位\(1\)和\(0\)最后会变成什么. 然后高位贪心:如果当 ...

  4. Luogu P2114[NOI2014]起床困难综合症 【贪心/位运算】By cellur925

    题目传送门 所以NOI的题现在简单惹? 30分做法:枚举开始的权值,n²过掉. 100分做法:竟然是贪心qwq.因为我们的计算背景是二进制下,所以我们贪心地想让每一位都是1.我们现在需要解决的问题,就 ...

  5. 【bzoj4811】[Ynoi2017]由乃的OJ 树链剖分/LCT+贪心

    Description 给你一个有n个点的树,每个点的包括一个位运算opt和一个权值x,位运算有&,l,^三种,分别用1,2,3表示. 每次询问包含三个数x,y,z,初始选定一个数v.然后v依 ...

  6. 【BZOJ4811】[Ynoi2017]由乃的OJ 树链剖分+线段树

    [BZOJ4811][Ynoi2017]由乃的OJ Description 由乃正在做她的OJ.现在她在处理OJ上的用户排名问题.OJ上注册了n个用户,编号为1-",一开始他们按照编号排名. ...

  7. [Ynoi2017]由乃的OJ

    题意 由乃正在做她的OJ.现在她在处理OJ上的用户排名问题.OJ上注册了n个用户,编号为1-",一开始他们按照编号 排名.由乃会按照心情对这些用户做以下四种操作,修改用户的排名和编号:然而由 ...

  8. P3613 睡觉困难综合征 LCT+贪心+位运算

    \(\color{#0066ff}{ 题目描述 }\) 由乃这个问题越想越迷糊,已经达到了废寝忘食的地步.结果她发现--晚上睡不着了!只能把自己的一个神经元(我们可以抽象成一个树形结构)拿出来,交给D ...

  9. luogu P3285 [SCOI2014]方伯伯的OJ splay 线段树

    LINK:方伯伯的OJ 一道稍有质量的线段树题目.不写LCT splay这辈子是不会单独写的 真的! 喜闻乐见的是 题目迷惑选手 \(op==1\) 查改用户在序列中的位置 题目压根没说位置啊 只有排 ...

随机推荐

  1. Scratch—实现一个按钮的动画效果

    上次介绍了利用克隆体操作生成菜单按钮,今天讲一讲如何让一个按钮具有动画的效果:当鼠标移到某个按钮上面时,显示动画效果 让菜单按钮有虚像效果 让菜单具有逐渐变大的效果 改变菜单按钮的颜色 其他的特效都是 ...

  2. JS 07 Dom

    DOM(Document Object Model): 结点的概念:整个文档就是由层次不同的多个节点组成,可以说结点代表了全部内容. 结点类型 1.元素结点 2.属性结点 3.文本结点   结点的注意 ...

  3. hdu 6377 度度熊看球赛 (dp)

    大意: $n$对情侣, $2n$个座位, 对于一个方案, 若$k$对情侣相邻, 则喧闹值增加$D^k$, 求喧闹值期望. 跟CF 840C一样, 设$dp[i][j]$为$i$个人, 有$j$对情侣相 ...

  4. BZOJ4516 SDOI2016生成魔咒(后缀自动机)

    本质不同子串数量等于所有点的len-parent树上父亲的len的和.可以直接维护. #include<iostream> #include<cstdio> #include& ...

  5. 深度挖坑:从数据角度看人脸识别中Feature Normalization,Weight Normalization以及Triplet的作用

    深度挖坑:从数据角度看人脸识别中Feature Normalization,Weight Normalization以及Triplet的作用 周翼南 北京大学 工学硕士 373 人赞同了该文章 基于深 ...

  6. css 小图标 & iconfont 字体图标

    前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! iconfont 字体图标 我们的需求中,很多时候会看到一些小的图形,或者叫图标,比如天猫网站中:     ...

  7. opengl 笔记

    1. 本函数可以禁用多边形正面或背面上的光照.阴影和颜色计算及操作,消除不必要的渲染计算是因为无论对象如何进行旋转或变换,都不会看到多边形的背面.用GL_CULL_FACE参数调用glEnable和g ...

  8. Linux Centos7配置mysql8.0数据库

    本文转至:672530440 在此感谢博主,撒花!!! 本文主要从以下几个方面对自己在centos7 下安装mysql8过程做如下总结: CentOS7 安装mysql8 步骤: window下的Na ...

  9. 关于一个mvc架构的cms的后台getshell

    都知道,mvc的话 除了根目录还有public目录可以访问,其他的访问都是不行的,因为会默认都是会解析url 然后我们来看今天的猪脚 大概的图片上传还有远程文件加载我黑盒测过了  就是想捞一个快一点的 ...

  10. shell取消键盘回显

    使用下面这个命令取消回显 stty -echo   使用下面这个命令打开回显   stty echo