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依 ...
随机推荐
- Kubernetes实战(二):k8s v1.11.1 prometheus traefik组件安装及集群测试
1.traefik traefik:HTTP层路由,官网:http://traefik.cn/,文档:https://docs.traefik.io/user-guide/kubernetes/ 功能 ...
- spark 调优概述
分为几个部分: 开发调优.资源调优.数据倾斜调优.shuffle调优 开发调优: 主要包括这几个方面 RDD lineage设计.算子的合理使用.特殊操作的优化等 避免创建重复的RDD,尽可能复用同一 ...
- Swagger2 生成 Spring Boot API 文档
Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.本文主要介绍了在 Spring Boot 添加 Swagger 支持, 生成可自动维护的 A ...
- PAT 1060 Are They Equal[难][科学记数法]
1060 Are They Equal(25 分) If a machine can save only 3 significant digits, the float numbers 12300 a ...
- gcc安装多个版本
http://blog.csdn.net/chid/article/details/6251781
- appscan 9.0.3.10 版本下载
http://download4.boulder.ibm.com/sar/CMA/RAA/07ukf/0/ 其他版本下载 https://www.cnblogs.com/hua198/p/100447 ...
- 11月16host文件
#################################################################################################### ...
- hdu5102 枚举每条边的长度
题意 给了 一颗 有 100000 个节点的树, 他们构成的边有 n*(n-1)/2 种. 每条边有一个长度,长度排序后 取前K条的 和, 枚举每条长度为1 的边 放进队列,然后通过成都为1 的表去 ...
- zoj3822
这题说得是给了一个n*m的棋盘,每天在这个棋盘中放置一个棋子,不能放在之前已经摆放过得地方,求最后使得每行每列都有至少一个棋子的期望天数是多少,这样我们考虑怎么放,放哪里,显然数据大而且不知道状态怎么 ...
- wkhtmtopdf--高分辨率HTML转PDF(三)
代码篇 浏览了很多实例,总找不到既能把HTML保存为PDF,同时实现流抛出的,所以自己琢磨了许久,终于实现了这样两个需求的结合体,下面来贡献一下吧~~ 下面我们来选择一个网页打印下,保存为PDF,而且 ...