Link

这题以前叫睡觉困难综合征。

首先我们需要知道起床困难综合征怎么做。

大概就是先用一个全\(0\)和全\(1\)的变量跑一遍处理出每一位\(1\)和\(0\)最后会变成什么。

然后高位贪心:如果当前位能够从\(0\)到\(1\),那么直接选上。如果能够从\(1\)到\(0\),那么能选就选。

现在我们把它放到了树上。

那么使用LCT或者树剖就可以解决了。

  1. #include<bits/stdc++.h>
  2. #define N 100007
  3. #define ull unsigned long long
  4. using namespace std;
  5. namespace IO
  6. {
  7. char ibuf[(1<<21)+1],obuf[(1<<21)+1],st[22],*iS,*iT,*oS=obuf,*oT=obuf+(1<<21);
  8. char Get() { return (iS==iT? (iT=(iS=ibuf)+fread(ibuf,1,(1<<21)+1,stdin),(iS==iT? EOF:*iS++)):*iS++); }
  9. void Flush() { fwrite(obuf,1,oS-obuf,stdout),oS=obuf; }
  10. void Put(char x) { *oS++=x; if(oS==oT) Flush(); }
  11. 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;}
  12. 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');}
  13. }
  14. using namespace IO;
  15. struct node{ull f0,f1;}val[N],lr[N],rl[N];
  16. node merge(node x,node y){return (node){(~x.f0&y.f0)|(x.f0&y.f1),(~x.f1&y.f0)|(x.f1&y.f1)};}
  17. int fa[N],ch[N][2],r[N];
  18. #define lc ch[p][0]
  19. #define rc ch[p][1]
  20. int nroot(int p){return ch[fa[p]][0]==p||ch[fa[p]][1]==p;}
  21. void pushup(int p)
  22. {
  23. lr[p]=rl[p]=val[p];
  24. if(lc) lr[p]=merge(lr[lc],lr[p]),rl[p]=merge(rl[p],rl[lc]);
  25. if(rc) lr[p]=merge(lr[p],lr[rc]),rl[p]=merge(rl[rc],rl[p]);
  26. }
  27. void pushrev(int p){swap(lr[p],rl[p]),swap(lc,rc),r[p]^=1;}
  28. void pushdown(int p){if(r[p])pushrev(lc),pushrev(rc),r[p]=0;}
  29. void pushall(int p){if(nroot(p))pushall(fa[p]);pushdown(p);}
  30. void rotate(int p)
  31. {
  32. int x=fa[p],y=fa[x],k=ch[x][1]==p,w=ch[p][!k];
  33. if(nroot(x)) ch[y][ch[y][1]==x]=p;
  34. ch[p][!k]=x,ch[x][k]=w,fa[w]=x,fa[x]=p,fa[p]=y,pushup(x);
  35. }
  36. void splay(int p)
  37. {
  38. pushall(p);
  39. for(int x;nroot(p);rotate(p))if(nroot(x=fa[p])) rotate((ch[x][0]==p)^(ch[fa[x]][0]==x)? p:x);
  40. pushup(p);
  41. }
  42. void access(int p){for(int x=0;p;p=fa[x=p])splay(p),rc=x,pushup(p);}
  43. void makeroot(int p){access(p),splay(p),pushrev(p);}
  44. void split(int u,int v){makeroot(u),access(v),splay(v);}
  45. void link(int u,int v){makeroot(u),fa[u]=v;}
  46. ull query(ull w,int v,int u)
  47. {
  48. ull ans=0,tmp=1;split(u,v);
  49. for(int k=63;~k;--k)
  50. if(lr[v].f0&(tmp<<k)) ans+=(tmp<<k);
  51. else if(lr[v].f1&(tmp<<k)&&w>=(tmp<<k)) w-=(tmp<<k),ans+=(tmp<<k);
  52. return ans;
  53. }
  54. int main()
  55. {
  56. int n=read(),m=read(),i,u,v;read();
  57. ull e=0,x;
  58. for(i=1;i<=n;++i)
  59. switch(read())
  60. {
  61. case 1:val[i]=(node){e,read()};break;
  62. case 2:val[i]=(node){read(),~e};break;
  63. case 3:x=read(),val[i]=(node){x,~x};break;
  64. }
  65. for(i=1;i<n;++i) u=read(),v=read(),link(u,v);
  66. while(m--)
  67. {
  68. if(read()==1) write(query(read(),read(),read()));
  69. else
  70. {
  71. u=read();
  72. switch(read())
  73. {
  74. case 1:val[u]=(node){e,read()};break;
  75. case 2:val[u]=(node){read(),~e};break;
  76. case 3:x=read(),val[u]=(node){x,~x};break;
  77. }
  78. splay(u);
  79. }
  80. }
  81. return Flush(),0;
  82. }

Luogu P5354 [Ynoi2017]由乃的OJ的更多相关文章

  1. luogu 5354 [Ynoi2017]由乃的OJ LCT+位运算

    如果做过起床困难综合征的话应该很快就能有思路,没做过那道题的话还真是挺费劲的. 我们不知道要带入的值是什么,但是我们可以知道假设带入值得当前位为 $1$ 时这一位在经过位运算后是否为 $1$. 至于这 ...

  2. 【BZOJ4811】[Ynoi2017]由乃的OJ 树链剖分+线段树

    [BZOJ4811][Ynoi2017]由乃的OJ Description 由乃正在做她的OJ.现在她在处理OJ上的用户排名问题.OJ上注册了n个用户,编号为1-",一开始他们按照编号排名. ...

  3. 【bzoj4811】[Ynoi2017]由乃的OJ 树链剖分/LCT+贪心

    Description 给你一个有n个点的树,每个点的包括一个位运算opt和一个权值x,位运算有&,l,^三种,分别用1,2,3表示. 每次询问包含三个数x,y,z,初始选定一个数v.然后v依 ...

  4. [Ynoi2017]由乃的OJ

    题意 由乃正在做她的OJ.现在她在处理OJ上的用户排名问题.OJ上注册了n个用户,编号为1-",一开始他们按照编号 排名.由乃会按照心情对这些用户做以下四种操作,修改用户的排名和编号:然而由 ...

  5. luogu P3285 [SCOI2014]方伯伯的OJ splay 线段树

    LINK:方伯伯的OJ 一道稍有质量的线段树题目.不写LCT splay这辈子是不会单独写的 真的! 喜闻乐见的是 题目迷惑选手 \(op==1\) 查改用户在序列中的位置 题目压根没说位置啊 只有排 ...

  6. 【bzoj4811】[Ynoi2017]由乃的OJ 树链剖分+线段树区间合并

    题解: 好像和noi那题并没有什么区别 只是加上了修改和变成树上 比较显然我们可以用树链剖分来维护

  7. BZOJ4811 [Ynoi2017]由乃的OJ 树链剖分

    原文链接http://www.cnblogs.com/zhouzhendong/p/8085286.html 题目传送门 - BZOJ4811 题意概括 是BZOJ3668长在树上并加上修改和区间询问 ...

  8. Luogu3613 睡觉困难综合征/BZOJ4811 Ynoi2017 由乃的OJ 树链剖分、贪心

    传送门 题意:给出一个$N$个点的树,树上每个点有一个位运算符号和一个数值.需要支持以下操作:修改一个点的位运算符号和数值,或者给出两个点$x,y$并给出一个上界$a$,可以选取一个$[0,a]$内的 ...

  9. bzoj 4811: [Ynoi2017]由乃的OJ

    树链剖分,用zkw线段树维护每条链两个方向上对每一位的变换情况,由于位数较少,可以用两个unsigned long long表示 #include<cstdio> typedef unsi ...

随机推荐

  1. kubectl管理kubernetes集群

    [root@master ~]# kubectl get nodes  查看集群节点NAME      STATUS    AGEnode1     Ready     25mnode2     Re ...

  2. zookeeper系列(一)zookeeper图形化的客户端工具

    追加一个zookeeper图形化的客户端工具: 1.zookeeper图像化客户端工具的下载地址:https://issues.apache.org/jira/secure/attachment/12 ...

  3. Word文档怎么从第二页加页码

    1.首先将光标放到首页的最后位置 2.“页面布局”—“分隔符”—“下一页” 3.“插入”—“页码”—选一种样式的页码 4.将光标定位到第二页的页脚处,“设计”—取消“链接到前一条页眉” 5.将第二页的 ...

  4. Mac Vmware NAT模式

    1.NAT模式原理 2.MAC上关于Vmware的配置 1)/Library/Preferences/VMware Fusion/networking MacBookPro:~ zhangxm$ vi ...

  5. Oracle Stream 同步数据

    1 引言     Oracle官方网: http://www.stanford.edu/dept/itss/docs/oracle/10g/server.101/b10727/strmover.htm ...

  6. java实现一个简单的验证码生成器

    最近看了网上很多大佬们写的验证码生成,寻思着自己也写一个,话不多说,代码如下: import java.awt.BasicStroke; import java.awt.Color; import j ...

  7. ZOJ - 1586 QS Network (Prim)

    ZOJ - 1586 QS Network (Prim) #include<iostream> #include<cstring> using namespace std; + ...

  8. XPATH了解

    特殊标签 找SVG这种特殊标签可以使用[name()='svg'],如//[name()='svg']/[name()='line'][2] 文本 找标签内的文本时可以使用: //*[text()=' ...

  9. DownloadManager系统自带下载实现apk后台下载功能

    DownloadManager是android2.3以后,系统下载的方法,是处理长期运行的HTTP下载的系统服务.客户端可以请求的URI被下载到一个特定的目标文件.客户端将会在后台与http交互进行下 ...

  10. flutter 切换tab后保留tab状态

    前言 最近在用flutter写一个小项目,在写主页面(底部导航栏+子页面)时遇到的一个问题:当点击底部item切换到另一页面, 再返回此页面时会重走它的initState方法(我们一般在initSta ...