[洛谷]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. ...
随机推荐
- memmove 和 memcpy的区别以及处理内存重叠问题
区别: memcpy和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下: void *memcpy(void *dst, const v ...
- 【iOS】swift 排序Sort函数用法(包含NSDictionary排序)
用了几分钟做的简单翻译 一个例子 直接贴代码,不过多解释 //这是我们的model class imageFile { var fileName = String() var fileID = Int ...
- C 函数指针与回调函数
函数指针是指向函数的指针变量. 通常我们说的指针变量是指向一个整型.字符型或数组等变量,而函数指针是指向函数. 函数指针可以像一般函数一样,用于调用函数.传递参数. 函数指针变量的声明: #inclu ...
- (转载) ASP.NET(C#) Web Api 通过文件流下载文件到本地实例
下载文件到本地是很多项目开发中需要实现的一个很简单的功能.说简单,是从具体的代码实现上来说的,.NET的文件下载方式有很多种,本示例给大家介绍的是ASP.NET Web Api方式返回HttpResp ...
- 基于dns搭建eureka集群
eureka集群方案: 1.通常我们部署的eureka节点多于两个,根据实际需求,只需要将相邻节点进行相互注册(eureka节点形成环状),就达到了高可用性集群,任何一个eureka节点挂掉不会受到影 ...
- SLF4J - 借助SLF4J, 统一适配所有日志实现为logback日志实现的实践
一.屏蔽各种日志实现,去掉各种日志实现的实现依赖 二.引入slf4j和各种日志实现的适配器 1.引入slf4j 2.引入各种日志实现的适配器(适配到slf4j) 3.引入logback 引入logba ...
- bugfree,CDbConnection 无法开启数据库连线: SQLSTATE[HY000] [2003] Can't connect to MySQL server on '192.168.0.99' (4)
安装bugfree后,访问报错:CDbConnection 无法开启数据库连线: SQLSTATE[HY000] [2003] Can't connect to MySQL server on '19 ...
- Django REST framework+Vue 打造生鲜超市(四)
五.商品列表页 5.1.django的view实现商品列表页 (1)goods/view_base.py 在goods文件夹下面新建view_base.py,为了区分django和django res ...
- codeforces 761B Dasha and friends
https://vjudge.net/problem/CodeForces-761B 题意: 有一个圆形跑道,上面有若干个障碍,分别给出两个人距离障碍的距离,问这两个人是否是在同一个跑道上跑步(我是这 ...
- hdu1005 Number Sequence---找循环节
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1005题目大意: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + ...