题解:

对于每一个节点,我们建立v0,v1

v0表示0进过会怎么样

v1表示1进过会怎么样

然后线段树合并

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=;
typedef unsigned long long ull;
ull a[N],zz,now,ans;
int n,m,k,op,xx,yy,Op[N],fi[N],ne[N*],v[N*],tot;
int size[N],fa[N],son[N],deep[N],rev[N],dfn[N],cnt,top[N];
struct Tree
{
ull v0,v1;Tree(){}
Tree(int op,ull x)
{
if (op==)v0=,v1=x;
else if (op==)v0=x,v1=~;
else v0=x,v1=(~)^x;
}
Tree(ull x,ull y){v0=x,v1=y;}
}trl[N*],trr[N*];
Tree operator+(Tree x,Tree y)
{
return Tree((x.v0&y.v1)|((~x.v0)&y.v0),(x.v1&y.v1)|((~x.v1)&y.v0));
}
void jb(int x,int y)
{
v[tot]=y;
ne[tot]=fi[x];
fi[x]=tot++;
}
void dfs1(int x)
{
size[x]=;
for (int i=fi[x];~i;i=ne[i])
if (v[i]!=fa[x])
{
fa[v[i]]=x;
deep[v[i]]=deep[x]+;
dfs1(v[i]);
size[x]+=size[v[i]];
if (size[v[i]]>size[son[x]])son[x]=v[i];
}
}
void dfs2(int x,int tp)
{
rev[dfn[x]=++cnt]=x;
top[x]=tp;
if (son[x])dfs2(son[x],tp);
for (int i=fi[x];~i;i=ne[i])
if (v[i]!=fa[x]&&v[i]!=son[x])dfs2(v[i],v[i]);
}
void build(int l,int r,int pos)
{
if (l==r)
{
trl[pos]=trr[pos]=Tree(Op[rev[l]],a[rev[l]]);
return;
}
int mid=(l+r)>>;
build(l,mid,pos*);
build(mid+,r,pos*+);
trl[pos]=trl[pos*]+trl[pos*+];
trr[pos]=trr[pos*+]+trr[pos*];
}
void insert(int l,int r,int pos,int num)
{
if (l==r)
{
trl[pos]=trr[pos]=Tree(Op[rev[l]],a[rev[l]]);
return;
}
int mid=(l+r)>>;
if (mid<num)insert(mid+,r,pos*+,num);
else insert(l,mid,pos*,num);
trl[pos]=trl[pos*]+trl[pos*+];
trr[pos]=trr[pos*+]+trr[pos*];
}
Tree query(int l,int r,int pos,int L,int R,int f)
{
if (l>=L&&r<=R)return f?trr[pos]:trl[pos];
int mid=(l+r)>>,lson=pos<<,rson=pos<<|;
if (mid<L)return query(mid+,r,pos*+,L,R,f);
if (mid>=R)return query(l,mid,pos*,L,R,f);
if (!f)return query(l,mid,pos*,L,R,f)+query(mid+,r,pos*+,L,R,f);
return query(mid+,r,pos*+,L,R,f)+query(l,mid,pos*,L,R,f);
}
Tree solve(int x,int y)
{
Tree vx=Tree((int),0ull),vy=Tree((int),0ull);
int fx=top[x],fy=top[y];
while (fx!=fy)
if (deep[fx]>deep[fy])
{
vx=vx+query(,n,,dfn[fx],dfn[x],);
x=fa[fx];
fx=top[x];
}
else
{
vy=query(,n,,dfn[fy],dfn[y],)+vy;
y=fa[fy];
fy=top[y];
}
if (deep[x]>deep[y])return vx+query(,n,,dfn[y],dfn[x],)+vy;
return vx+query(,n,,dfn[x],dfn[y],)+vy;
}
int main()
{
memset(fi,-,sizeof(fi));
deep[]=;
scanf("%d%d%d",&n,&m,&k);
for (int i=;i<=n;i++)scanf("%d%llu",&Op[i],&a[i]);
for (int i=;i<n;i++)
{
scanf("%d%d",&xx,&yy);
jb(xx,yy);jb(yy,xx);
}
dfs1();dfs2(,);
build(,n,);
while (m--)
{
scanf("%d%d%d%llu",&op,&xx,&yy,&zz);
if (op==)Op[xx]=yy,a[xx]=zz,insert(,n,,dfn[xx]);
else
{
Tree t=solve(xx,yy);now=ans=;
for (int i=k-;~i;i--)
if (t.v0&(1ull<<i))ans+=1ull<<i;
else if (t.v1&(1ull<<i)&&now+(1ull<<i)<=zz)
{
now+=1ull<<i;
ans+=1ull<<i;
}
printf("%llu\n",ans);
}
}
return ;
}

bzoj4811的更多相关文章

  1. BZOJ4811 [Ynoi2017]由乃的OJ 树链剖分

    原文链接http://www.cnblogs.com/zhouzhendong/p/8085286.html 题目传送门 - BZOJ4811 题意概括 是BZOJ3668长在树上并加上修改和区间询问 ...

  2. [BZOJ4811][YNOI2017]由乃的OJ(树链剖分+线段树)

    起床困难综合症那题,只要从高往低贪心,每次暴力跑一边看这一位输入0和1分别得到什么结果即可. 放到序列上且带修改,只要对每位维护一个线段树,每个节点分别记录0和1从左往右和从右往左走完这段区间后变成的 ...

  3. BZOJ4811 [Ynoi2017]由乃的OJ

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  4. 【bzoj4811】由乃的OJ

    Portal --> bzoj4811 Solution  这题可以用树剖+线段树做也可以用LCT做,不过大体思路是一样的  (接下来先讲的是树剖+线段树的做法,再提LCT的做法) ​  首先位 ...

  5. BZOJ4811 Ynoi2017由乃的OJ(树链剖分+线段树)

    先考虑NOI2014的水题,显然从高位到低位贪心,算一下该位取0和1分别得到什么即可. 加强这个水题,变成询问区间.那么线段树维护该位取0和1从左到右和从右到左走完这个节点表示的区间会变成什么即可,也 ...

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

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

  7. 【bzoj4811】[Ynoi2017]由乃的OJ 树链剖分+线段树区间合并

    题解: 好像和noi那题并没有什么区别 只是加上了修改和变成树上 比较显然我们可以用树链剖分来维护

  8. Luogu3613 睡觉困难综合征/BZOJ4811 Ynoi2017 由乃的OJ 树链剖分、贪心

    传送门 题意:给出一个$N$个点的树,树上每个点有一个位运算符号和一个数值.需要支持以下操作:修改一个点的位运算符号和数值,或者给出两个点$x,y$并给出一个上界$a$,可以选取一个$[0,a]$内的 ...

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

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

随机推荐

  1. 奔小康赚大钱---hdu2255(最大带权匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 带权匹配问题的模板: 运用KM算法: #include<stdio.h> #incl ...

  2. 爬虫基础 - Robots协议

    Robots协议 指定一个robots.txt文件,告诉爬虫引擎怎么爬取 https://www.taobao.com/robots.txt User-agent: Baiduspider Allow ...

  3. 【Python】自动化测试框架-共通方法汇总

    1.滚动滚动条(有的时候页面元素element取得对但是并没有回显正确的数据,可能是因为页面第一次加载很慢,所以页面可能做了滚动到哪里就加载到哪里的效果,此刻我们就需要用到滚动条自动滚动这段代码让页面 ...

  4. 使用distcp并行拷贝大数据文件

    以前我们介绍的访问HDFS的方法都是单线程的,Hadoop中有一个工具可以让我们并行的拷贝大量数据文件,这个工具就是distcp. distcp的典型应用就是在两个HDFS集群中拷贝文件,如果两个集群 ...

  5. Qt emit的使用

    1. 假设现在我定义了一个类A,现在想在A的一个函数void A::function1()当中的结尾处emit一个信号signal1(),然后利用这个信号触发另一个类B进行某项操作void B::fu ...

  6. Hadoop mapreduce自定义排序WritableComparable

    本文发表于本人博客. 今天继续写练习题,上次对分区稍微理解了一下,那根据那个步骤分区.排序.分组.规约来的话,今天应该是要写个排序有关的例子了,那好现在就开始! 说到排序我们可以查看下hadoop源码 ...

  7. Smarty 函数

    html_checkboxes 自定义函数 html_checkboxes 根据给定的数据创建复选按钮组. 该函数可以指定哪些元素被选定. 要么必须指定 values 和 ouput 属性,要么指定 ...

  8. CCPC-Wannafly Winter Camp Day1 (Div2, onsite)

    Replay Dup4: 要是不挂机,再多仔细想想就好了 J确实自闭好久,一直在想正确性,最后数据错了,喵喵喵? 还是要保证充足的休息啊,中间睡了一小会儿,也不知道睡了多久,醒来他们就又过了一道 要发 ...

  9. poj1151 Atlantis && cdoj 1600艾尔大停电 矩形面积并

    题目: Atlantis Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 23758   Accepted: 8834 Des ...

  10. javascript模式(1)--私有成员

    javascript是基于对象的一门语言,没有想java等语言那样子拥有封装的特性.但是javascript可以通过闭包来进行模拟. 1.构造函数与私有成员 可以用构造函数形成一个闭包,实现内部成员的 ...