[洛谷]P3613 睡觉困难综合征
题目大意:给出一棵n个点的树,每个点有一个运算符(与、或、异或)和一个数,支持两种操作,第一种修改一个点的运算符和数,第二种给出x,y,z,询问若有一个0~z之间的数从点x走到点y(简单路径),并且对路径上经过的点做对应的运算,最终最大能是多少。(n,操作数<=100,000,数字在[0,2^64)之间)
思路:洛谷改编NOI的一道神题,树剖/LCT维护若一开始全是0/全是1,经过一条链后各位会变成什么,用位运算合并信息,然后每个询问,从高位往低位贪心,每次取0和1中经过这条链后得到的较大值,若相同则取0,总复杂度O(nlogn)/O(nlogn^2)。
#include<cstdio>
#include<algorithm>
using namespace std;
#define ll unsigned long long
inline ll read()
{
ll x;char c;
while((c=getchar())<''||c>'');
for(x=c-'';(c=getchar())>=''&&c<='';)x=(x<<)+(x<<)+c-'';
return x;
}
#define MN 100000
#define L(x) c[x][0]
#define R(x) c[x][1]
struct edge{int nx,t;}e[MN*+];
struct data{ll f[];}lf[MN+],rf[MN+],f[MN+];
data operator+(const data&a,const data&b)
{
return (data){~a.f[]&b.f[]|a.f[]&b.f[],
~a.f[]&b.f[]|a.f[]&b.f[]};
}
int h[MN+],en,fa[MN+],c[MN+][],rv[MN+],z[MN+],zn;
inline void ins(int x,int y)
{
e[++en]=(edge){h[x],y};h[x]=en;
e[++en]=(edge){h[y],x};h[y]=en;
}
void dfs(int x)
{
for(int i=h[x];i;i=e[i].nx)
if(e[i].t!=fa[x])fa[e[i].t]=x,dfs(e[i].t);
}
inline void up(int x)
{
lf[x]=rf[x]=f[x];
if(L(x))lf[x]=lf[L(x)]+lf[x],rf[x]=rf[x]+rf[L(x)];
if(R(x))lf[x]=lf[x]+lf[R(x)],rf[x]=rf[R(x)]+rf[x];
}
void init(int x,int o,ll z)
{
if(o==)f[x]=(data){,z};
if(o==)f[x]=(data){z,-};
if(o==)f[x]=(data){z,~z};
up(x);
}
inline void rev(int x){rv[x]^=;swap(L(x),R(x));swap(lf[x],rf[x]);}
inline void down(int x){if(rv[x])rev(L(x)),rev(R(x)),rv[x]=;}
inline bool isc(int x){return L(fa[x])==x||R(fa[x])==x;}
void rotate(int x)
{
int f=fa[x],ff=fa[f],l=R(f)==x,r=l^;
if(isc(f))c[ff][R(ff)==f]=x;
fa[f]=x;fa[x]=ff;fa[c[x][r]]=f;
c[f][l]=c[x][r];up(c[x][r]=f);
}
void splay(int x)
{
for(int i=z[zn=]=x;isc(i);)i=z[++zn]=fa[i];
for(;zn;--zn)down(z[zn]);
for(int f;isc(x);rotate(x))
if(isc(f=fa[x]))rotate(L(fa[f])==f^L(f)==x?x:f);
up(x);
}
void access(int x)
{
for(int i=;x;x=fa[i=x])splay(x),R(x)=i;
}
int main()
{
int n,m,i,x,u;ll z,ans,f0,f1;
n=read();m=read();read();
for(i=;i<=n;++i)x=read(),init(i,x,read());
for(i=;i<n;++i)ins(read(),read());
dfs();
while(m--)
if(read()<)
{
access(x=read());splay(x);rev(x);
access(x=read());splay(x);
z=read();ans=u=;
for(i=;i--;)
if(u||(z&(1LLU<<i)))
{
f0=lf[x].f[]&(1LLU<<i);
f1=lf[x].f[]&(1LLU<<i);
if(f0>=f1)u=;
ans|=max(f0,f1);
}
else ans|=lf[x].f[]&(1LLU<<i);
printf("%llu\n",ans);
}
else x=read(),i=read(),splay(x),init(x,i,read());
}
[洛谷]P3613 睡觉困难综合征的更多相关文章
- 【刷题】洛谷 P3613 睡觉困难综合征
题目背景 刚立完Flag我就挂了WC和THUWC... 时间限制0.5s,空间限制128MB 因为Claris大佬帮助一周目由乃通过了Deus的题,所以一周目的由乃前往二周目世界找雪辉去了 由于二周目 ...
- 洛谷P3613 睡觉困难综合征(LCT)
题目: P3613 睡觉困难综合症 解题思路: LCT,主要是维护链上的多位贪心答案,推个公式:分类讨论入0/1的情况,合并就好了(公式是合并用的) 代码(我不知道之前那个为啥一直wa,改成结构体就好 ...
- 洛谷P3613 睡觉困难综合征(LCT,贪心)
洛谷题目传送门 膜拜神犇出题人管理员!!膜拜yler和ZSY!! 没错yler连续教我这个蒟蒻写起床困难综合症和睡觉困难综合症%%%Orz,所以按位贪心的思路可以继承下来 这里最好还是写树剖吧,不过我 ...
- 洛谷P3613 睡觉困难综合征
传送门 题解 人生第一道由乃…… 做这题之前应该先去把这一题给切掉->这里 我的题解->这里 然后先膜一波zsy大佬和flashhu大佬 大体思路就是先吧全0和全1的都跑答案,然后按位贪心 ...
- [洛谷P3613]睡觉困难综合症
写码30min,调码3h的题.. 好在最后查出来了 , , n, x, y, z); 改成了 , , n, mark[x], y, z); 然后$40\rightarrow 100$ #include ...
- 洛谷3613睡觉困难综合征(LCT维护链信息(前后缀)+贪心)
这个题目还是很好啊QWQ很有纪念意义 首先,如果在序列上且是单次询问的话,就是一个非常裸的贪心了QWQ这也是NOI当时原题的问题和数据范围 我们考虑上树的话,应该怎么做? 我的想法是,对于每一位建一个 ...
- [bzoj3668][Noi2014]起床困难综合症/[洛谷3613]睡觉困难综合症
来自FallDream的博客,未经允许,请勿转载,谢谢. 21 世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳.作为一名青春阳光好少年,atm 一直坚持与起床困难综 ...
- P3613 睡觉困难综合征(LCT + 位运算)
题意 NOI2014 起床困难综合症 放在树上,加上单点修改与链上查询. 题解 类似于原题,我们只需要求出 \(0\) 和 \(2^{k - 1} - 1\) 走过这条链会变成什么值,就能确定每一位为 ...
- [P3613]睡觉困难综合征
Description: 给定一个n个点的树,每个点有一个操作符号 "&" "|" "^" ,以及一个权值 要求支持以下操作: 1. ...
随机推荐
- 团队作业4——第一次项目冲刺(Alpha版本)2017.11.19
第三次会议:2017-11-16 第二次会议讨论的还没有完全实现,于是在第三次会议上对此进行了一些对我们工作上的看法,得出结论:多花时间啊!!!! 又没照照片图: 会议主要内容: 1.登录注册完善 2 ...
- Count on a tree
bzoj 2588: Spoj 10628. Count on a tree http://www.lydsy.com/JudgeOnline/problem.php?id=2588 Descrip ...
- 【非官方】Surging 微服务框架使用入门
前言 本文非 Surging 官方教程,只是自己学习的总结.如有哪里不对,还望指正. 我对 surging 的看法 我目前所在的公司采用架构就是类似与Surging的RPC框架,在.NET 4.0框架 ...
- python之路--day15---软件开发目录规范
软件开发目录规范 bin--启动文件 conf--配置文件 core--核心代码 db--数据文件 lib--常用功能代码 log--日志文件 readme--软件介绍
- HTML事件处理程序
事件处理程序中的代码执行时,有权访问全局作用域中任何代码. //为按钮btn_event添加了两个个事件处理程序,而且该事件会在冒泡阶段触发(最后一个参数是false). var btn_event ...
- LeetCode & Q217-Contains Duplicate-Easy
Array Hash Table Description: Given an array of integers, find if the array contains any duplicates. ...
- 算法题丨Remove Element
描述 Given an array and a value, remove all instances of that value in-place and return the new length ...
- istio入门(01)istio是什么?
- io使用的设计模式
File f = new File("c:/a.txt"); 1. FileInputStream fis = new FileInputStream(f); 2. Reader ...
- DMO节点内部插入的常用方法与区别
1.DOM内部插入append()与appendTo() 动态创建的元素是不够的,它只是临时存放在内存中,最终我们需要放到页面文档并呈现出来.那么问题来了,怎么放到文档上? 这里就涉及到一个位置关系, ...