bzoj4811
题解:
对于每一个节点,我们建立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的更多相关文章
- BZOJ4811 [Ynoi2017]由乃的OJ 树链剖分
原文链接http://www.cnblogs.com/zhouzhendong/p/8085286.html 题目传送门 - BZOJ4811 题意概括 是BZOJ3668长在树上并加上修改和区间询问 ...
- [BZOJ4811][YNOI2017]由乃的OJ(树链剖分+线段树)
起床困难综合症那题,只要从高往低贪心,每次暴力跑一边看这一位输入0和1分别得到什么结果即可. 放到序列上且带修改,只要对每位维护一个线段树,每个节点分别记录0和1从左往右和从右往左走完这段区间后变成的 ...
- BZOJ4811 [Ynoi2017]由乃的OJ
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- 【bzoj4811】由乃的OJ
Portal --> bzoj4811 Solution 这题可以用树剖+线段树做也可以用LCT做,不过大体思路是一样的 (接下来先讲的是树剖+线段树的做法,再提LCT的做法) 首先位 ...
- BZOJ4811 Ynoi2017由乃的OJ(树链剖分+线段树)
先考虑NOI2014的水题,显然从高位到低位贪心,算一下该位取0和1分别得到什么即可. 加强这个水题,变成询问区间.那么线段树维护该位取0和1从左到右和从右到左走完这个节点表示的区间会变成什么即可,也 ...
- 【BZOJ4811】[Ynoi2017]由乃的OJ 树链剖分+线段树
[BZOJ4811][Ynoi2017]由乃的OJ Description 由乃正在做她的OJ.现在她在处理OJ上的用户排名问题.OJ上注册了n个用户,编号为1-",一开始他们按照编号排名. ...
- 【bzoj4811】[Ynoi2017]由乃的OJ 树链剖分+线段树区间合并
题解: 好像和noi那题并没有什么区别 只是加上了修改和变成树上 比较显然我们可以用树链剖分来维护
- Luogu3613 睡觉困难综合征/BZOJ4811 Ynoi2017 由乃的OJ 树链剖分、贪心
传送门 题意:给出一个$N$个点的树,树上每个点有一个位运算符号和一个数值.需要支持以下操作:修改一个点的位运算符号和数值,或者给出两个点$x,y$并给出一个上界$a$,可以选取一个$[0,a]$内的 ...
- 【bzoj4811】[Ynoi2017]由乃的OJ 树链剖分/LCT+贪心
Description 给你一个有n个点的树,每个点的包括一个位运算opt和一个权值x,位运算有&,l,^三种,分别用1,2,3表示. 每次询问包含三个数x,y,z,初始选定一个数v.然后v依 ...
随机推荐
- 【css flex】将多个<div>放在同一行
使用style里的flex属性 默认情况下,一个div独占一行 使用css选择器给外层div加上以下flex属性,则该div的子div可以在同一行中显示, .runs-paginator-flex-c ...
- iOS定位原理和使用建议(转)
原文:http://ibbs.91.com/thread-1548870-1-1.html 看到很多网友讨论iOS设备定位的问题,这里将我们所了解的关于iPhone.iPad.iPod等的定位原理做详 ...
- python 定义类 学习1
此时的d1就是类Dog的实例化对象 实例化,其实就是以Dog类为模版,在内存里开辟一块空间,存上数据,赋值成一个变量名 # 定义类模板 class dog(object): # 定义类的方法功能 # ...
- 江苏新美星智能物流无人叉车AGV
新美星一家全球领先的液体包装解决方案供应商,高附加值的产品应用于食品饮料等行业,为液体食品和自动化系统提供完整解决方案.新美星,于CBST2017展会首次亮相了能够从仓库或工厂的某个地方把材料.托盘和 ...
- 详解PHP实现定时任务的五种方法
这几天需要用PHP写一个定时抓取网页的服务器应用. 在网上搜了一下解决办法, 找到几种解决办法,现总结如下. 定时运行任务对于一个网站来说,是一个比较重要的任务,比如定时发布文档,定时清理垃圾信息等, ...
- Openstack(九)部署nova服务(控制节点)
9.1nova服务介绍 nova是openstack最早的组件之一,nova分为控制节点和计算节点,计算节点通过nova computer进行虚拟机创建,通过libvirt调用kvm创建虚拟机,nov ...
- [py][lc]python的纸牌知识点
模块collections-collections.namedtuple表示tuple 如表示一个坐标, t = (1,2), 搞不清楚. 如果这样就对了Point(x=1, y=2) from co ...
- pssh批量远程管理工具
Linux下批量管理工具pssh使用记录 pssh是一款开源的软件,使用python实现,用于批量ssh操作大批量机器:pssh是一个可以在多台服务器上执行命令的工具,同时支持拷贝文件,是同类工具 ...
- 23TCP通信
.pro 文件中加入:QT+=network 在Qt中实现TCP/IP服务器端通信的流程: 1.创建监听套接字,QTcpServer 2.将监听套接字设置为监听模式, listen 3.等待并接受客户 ...
- CCPC 2017-2018, Finals Solution
A - Dogs and Cages 水. #include <bits/stdc++.h> using namespace std; int t; double n; int main( ...