Luogu P5354 [Ynoi2017]由乃的OJ
Link
这题以前叫睡觉困难综合征。
首先我们需要知道起床困难综合征怎么做。
大概就是先用一个全\(0\)和全\(1\)的变量跑一遍处理出每一位\(1\)和\(0\)最后会变成什么。
然后高位贪心:如果当前位能够从\(0\)到\(1\),那么直接选上。如果能够从\(1\)到\(0\),那么能选就选。
现在我们把它放到了树上。
那么使用LCT或者树剖就可以解决了。
#include<bits/stdc++.h>
#define N 100007
#define ull unsigned long long
using namespace std;
namespace IO
{
char ibuf[(1<<21)+1],obuf[(1<<21)+1],st[22],*iS,*iT,*oS=obuf,*oT=obuf+(1<<21);
char Get() { return (iS==iT? (iT=(iS=ibuf)+fread(ibuf,1,(1<<21)+1,stdin),(iS==iT? EOF:*iS++)):*iS++); }
void Flush() { fwrite(obuf,1,oS-obuf,stdout),oS=obuf; }
void Put(char x) { *oS++=x; if(oS==oT) Flush(); }
ull read(){ull x=0;char ch=Get();while(ch>'9'||ch<'0')ch=Get();while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=Get();return x;}
void write(ull x){int top=0;if(!x)return (void)Put('0'),Put('\n');while(x)st[++top]=(x%10)+48,x/=10;while(top)Put(st[top--]);Put('\n');}
}
using namespace IO;
struct node{ull f0,f1;}val[N],lr[N],rl[N];
node merge(node x,node y){return (node){(~x.f0&y.f0)|(x.f0&y.f1),(~x.f1&y.f0)|(x.f1&y.f1)};}
int fa[N],ch[N][2],r[N];
#define lc ch[p][0]
#define rc ch[p][1]
int nroot(int p){return ch[fa[p]][0]==p||ch[fa[p]][1]==p;}
void pushup(int p)
{
lr[p]=rl[p]=val[p];
if(lc) lr[p]=merge(lr[lc],lr[p]),rl[p]=merge(rl[p],rl[lc]);
if(rc) lr[p]=merge(lr[p],lr[rc]),rl[p]=merge(rl[rc],rl[p]);
}
void pushrev(int p){swap(lr[p],rl[p]),swap(lc,rc),r[p]^=1;}
void pushdown(int p){if(r[p])pushrev(lc),pushrev(rc),r[p]=0;}
void pushall(int p){if(nroot(p))pushall(fa[p]);pushdown(p);}
void rotate(int p)
{
int x=fa[p],y=fa[x],k=ch[x][1]==p,w=ch[p][!k];
if(nroot(x)) ch[y][ch[y][1]==x]=p;
ch[p][!k]=x,ch[x][k]=w,fa[w]=x,fa[x]=p,fa[p]=y,pushup(x);
}
void splay(int p)
{
pushall(p);
for(int x;nroot(p);rotate(p))if(nroot(x=fa[p])) rotate((ch[x][0]==p)^(ch[fa[x]][0]==x)? p:x);
pushup(p);
}
void access(int p){for(int x=0;p;p=fa[x=p])splay(p),rc=x,pushup(p);}
void makeroot(int p){access(p),splay(p),pushrev(p);}
void split(int u,int v){makeroot(u),access(v),splay(v);}
void link(int u,int v){makeroot(u),fa[u]=v;}
ull query(ull w,int v,int u)
{
ull ans=0,tmp=1;split(u,v);
for(int k=63;~k;--k)
if(lr[v].f0&(tmp<<k)) ans+=(tmp<<k);
else if(lr[v].f1&(tmp<<k)&&w>=(tmp<<k)) w-=(tmp<<k),ans+=(tmp<<k);
return ans;
}
int main()
{
int n=read(),m=read(),i,u,v;read();
ull e=0,x;
for(i=1;i<=n;++i)
switch(read())
{
case 1:val[i]=(node){e,read()};break;
case 2:val[i]=(node){read(),~e};break;
case 3:x=read(),val[i]=(node){x,~x};break;
}
for(i=1;i<n;++i) u=read(),v=read(),link(u,v);
while(m--)
{
if(read()==1) write(query(read(),read(),read()));
else
{
u=read();
switch(read())
{
case 1:val[u]=(node){e,read()};break;
case 2:val[u]=(node){read(),~e};break;
case 3:x=read(),val[u]=(node){x,~x};break;
}
splay(u);
}
}
return Flush(),0;
}
Luogu P5354 [Ynoi2017]由乃的OJ的更多相关文章
- luogu 5354 [Ynoi2017]由乃的OJ LCT+位运算
如果做过起床困难综合征的话应该很快就能有思路,没做过那道题的话还真是挺费劲的. 我们不知道要带入的值是什么,但是我们可以知道假设带入值得当前位为 $1$ 时这一位在经过位运算后是否为 $1$. 至于这 ...
- 【BZOJ4811】[Ynoi2017]由乃的OJ 树链剖分+线段树
[BZOJ4811][Ynoi2017]由乃的OJ Description 由乃正在做她的OJ.现在她在处理OJ上的用户排名问题.OJ上注册了n个用户,编号为1-",一开始他们按照编号排名. ...
- 【bzoj4811】[Ynoi2017]由乃的OJ 树链剖分/LCT+贪心
Description 给你一个有n个点的树,每个点的包括一个位运算opt和一个权值x,位运算有&,l,^三种,分别用1,2,3表示. 每次询问包含三个数x,y,z,初始选定一个数v.然后v依 ...
- [Ynoi2017]由乃的OJ
题意 由乃正在做她的OJ.现在她在处理OJ上的用户排名问题.OJ上注册了n个用户,编号为1-",一开始他们按照编号 排名.由乃会按照心情对这些用户做以下四种操作,修改用户的排名和编号:然而由 ...
- luogu P3285 [SCOI2014]方伯伯的OJ splay 线段树
LINK:方伯伯的OJ 一道稍有质量的线段树题目.不写LCT splay这辈子是不会单独写的 真的! 喜闻乐见的是 题目迷惑选手 \(op==1\) 查改用户在序列中的位置 题目压根没说位置啊 只有排 ...
- 【bzoj4811】[Ynoi2017]由乃的OJ 树链剖分+线段树区间合并
题解: 好像和noi那题并没有什么区别 只是加上了修改和变成树上 比较显然我们可以用树链剖分来维护
- BZOJ4811 [Ynoi2017]由乃的OJ 树链剖分
原文链接http://www.cnblogs.com/zhouzhendong/p/8085286.html 题目传送门 - BZOJ4811 题意概括 是BZOJ3668长在树上并加上修改和区间询问 ...
- Luogu3613 睡觉困难综合征/BZOJ4811 Ynoi2017 由乃的OJ 树链剖分、贪心
传送门 题意:给出一个$N$个点的树,树上每个点有一个位运算符号和一个数值.需要支持以下操作:修改一个点的位运算符号和数值,或者给出两个点$x,y$并给出一个上界$a$,可以选取一个$[0,a]$内的 ...
- bzoj 4811: [Ynoi2017]由乃的OJ
树链剖分,用zkw线段树维护每条链两个方向上对每一位的变换情况,由于位数较少,可以用两个unsigned long long表示 #include<cstdio> typedef unsi ...
随机推荐
- 苹果cms网站添加TV电视直播教程
1,首先添加一个新分类,分类的名称填写“电视直播”[状态:选启用].这里要注意下面的分类模板和播放模板需要修改一下名称.即在默认名称前面添加 " v_" 即v加下划线即可. 2,刚 ...
- 「Luogu P5603」小O与桌游
题目链接 戳我 \(Solution\) 我们来分析题目. 实际上就是求一个拓扑序满足拓扑序的前缀最大值最多/最少 对于第一种情况,很明显一直选当前能选的最小的是最优的对吧.因为你需要大的尽可能多.用 ...
- Inter IPP 绘图 ippi/ipps
IPP的资料网上比较少,主要还是参考Inter官网和文档 官方文档ipps.pdf主要是对数据做处理,包括加减乘除.FFT.DFT等 文档ippi.pdf只要是对图像做处理,包括通道转换.图片处理等 ...
- spiderkeeper使用教程
安装包 pip install scrapy pip install scrapyd pip install scrapyd-client pip install spiderkeeper 进入到sc ...
- flask 第五篇
需求: 1. 用户名: oldboy 密码: oldboy123 2. 用户登录成功之后跳转到列表页面 3. 失败有消息提示,重新登录 4.点击学生名称之后,可以看到学生的详细信息 后端: from ...
- 【java多线程】多线程中的long和double
在看一些代码的时候,会发现在定义long型和double型的变量时,会在前面加上volatile关键字,当然也会看到在其它原子类型的变量前加上这个关键字,但这里要说的还是有区别的. 在java中,ja ...
- hive 源码笔记(1):命令行执行的主流程。
1. 'hive'命令是(默认为hive跟目录)./bin下的一个shell脚本,依次加载 ./bin/hive-config.sh, ./conf/hive-env.sh, 设置与hadoop.sp ...
- 警告(alert)、确认(confirm)
我们在访问网站的时候,有时会突然弹出一个小窗口,上面写着一段提示信息文字.如果你不点击“确定”,就不能对网页做任何操作,这个小窗口就是使用alert实现的. 语法: alert(字符串或变量);注:a ...
- 通过ssh管道连接内网数据库(mysql)
公网连接内网数据库(如云数据库)时,通常需要白名单:如果不是白名单IP,通常需要一个跳板机(类似代理)来连接内网数据库, 下方以mysql为例(其他数据库基本一致): import pymysql a ...
- 关于Linux下的连接文件学习总结
1.连接文件区分为两种,一种类似windows下快捷方式,使用户能够快速连接到目标文件或目录. 另一种则通过文件系统中的inode连接来产生新文件名,而不是产生新文件. 两种方式分别称为符号/硬连接. ...