起床困难综合症那题,只要从高往低贪心,每次暴力跑一边看这一位输入0和1分别得到什么结果即可。

放到序列上且带修改,只要对每位维护一个线段树,每个节点分别记录0和1从左往右和从右往左走完这段区间后变成的数即可。

放到树上,只要树链剖分即可。但这里有一个很大的常数k,实际上我们只需要一个数就可以记录64个二进制位的信息,于是复杂度$O(n\log^2 n)$

小错误毁一生。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #define ls (x<<1)
  6. #define rs (ls|1)
  7. #define lson ls,L,mid
  8. #define rson rs,mid+1,R
  9. #define rep(i,l,r) for (int i=(l); i<=(r); i++)
  10. #define For(i,x) for (int i=h[x],k; i; i=nxt[i])
  11. typedef unsigned long long ll;
  12. using namespace std;
  13.  
  14. const int N=;
  15. ll z,I=;
  16. int n,m,k,u,v,x,y,op,cnt,tim,pos[N],sz[N],dep[N],son[N],fa[N],dfn[N],top[N];
  17. int h[N],to[N<<],nxt[N<<];
  18. struct P{ int op; ll x; }p[N];
  19. struct D{ ll s0,s1; }v1[N<<],v2[N<<];
  20. struct S{ int l,r; }lp[N],rp[N];
  21.  
  22. void add(int u,int v){ to[++cnt]=v; nxt[cnt]=h[u]; h[u]=cnt; }
  23.  
  24. void work(int x,P p){
  25. if (p.op==) v1[x]=v2[x]=(D){,p.x};
  26. if (p.op==) v1[x]=v2[x]=(D){p.x,-};
  27. if (p.op==) v1[x]=v2[x]=(D){p.x,p.x^(-)};
  28. }
  29.  
  30. D operator +(D a,D b){ return (D){((~a.s0)&b.s0)|(a.s0&b.s1),((~a.s1)&b.s0)|(a.s1&b.s1)}; }
  31. void upd(int x){ v1[x]=v1[ls]+v1[rs]; v2[x]=v2[rs]+v2[ls]; }
  32.  
  33. void dfs(int x){
  34. sz[x]=; dep[x]=dep[fa[x]]+;
  35. For(i,x) if ((k=to[i])!=fa[x]){
  36. fa[k]=x; dfs(k); sz[x]+=sz[k];
  37. if (sz[k]>sz[son[x]]) son[x]=k;
  38. }
  39. }
  40.  
  41. void dfs2(int x,int tp){
  42. top[x]=tp; dfn[x]=++tim; pos[tim]=x;
  43. if (son[x]) dfs2(son[x],tp);
  44. For(i,x) if ((k=to[i])!=fa[x] && k!=son[x]) dfs2(k,k);
  45. }
  46.  
  47. void build(int x,int L,int R){
  48. if (L==R){ work(x,p[pos[L]]); return; }
  49. int mid=(L+R)>>;
  50. build(lson); build(rson); upd(x);
  51. }
  52.  
  53. void mdf(int x,int L,int R,int pos,P p){
  54. if (L==R){ work(x,p); return; }
  55. int mid=(L+R)>>;
  56. if (pos<=mid) mdf(lson,pos,p); else mdf(rson,pos,p);
  57. upd(x);
  58. }
  59.  
  60. D que(int x,int L,int R,int l,int r,int k){
  61. if (L==l && r==R) return (k==) ? v1[x] : v2[x];
  62. int mid=(L+R)>>;
  63. if (r<=mid) return que(lson,l,r,k);
  64. else if (l>mid) return que(rson,l,r,k);
  65. else{
  66. D a=que(lson,l,mid,k),b=que(rson,mid+,r,k);
  67. return (k==) ? a+b : b+a;
  68. }
  69. }
  70.  
  71. void solve(int x,int y,ll z){
  72. int ld=,rd=,rev=;
  73. S *L=lp,*R=rp;
  74. for (; top[x]!=top[y]; x=fa[top[x]]){
  75. if (dep[top[x]]<dep[top[y]]) rev^=,swap(x,y),swap(ld,rd),swap(L,R);
  76. L[++ld]=(S){dfn[top[x]],dfn[x]};
  77. }
  78. if (dep[x]<dep[y]) rev^=,swap(x,y),swap(ld,rd),swap(L,R);
  79. L[++ld]=(S){dfn[y],dfn[x]};
  80. if (rev) swap(ld,rd),swap(L,R);
  81. D res=(D){,-};
  82. rep(i,,ld) res=res+que(,,n,L[i].l,L[i].r,);
  83. for (int i=rd; i; i--) res=res+que(,,n,R[i].l,R[i].r,);
  84. ll s=,c=;
  85. for (int i=k-; ~i; i--)
  86. if (res.s0&(I<<i)) s+=I<<i;
  87. else if ((res.s1&(I<<i)) && c+(I<<i)<=z) c+=I<<i,s+=I<<i;
  88. printf("%llu\n",s);
  89. }
  90.  
  91. int main(){
  92. freopen("bzoj4811.in","r",stdin);
  93. freopen("bzoj4811.out","w",stdout);
  94. scanf("%d%d%d",&n,&m,&k);
  95. rep(i,,n) scanf("%d%llu",&p[i].op,&p[i].x);
  96. rep(i,,n) scanf("%d%d",&u,&v),add(u,v),add(v,u);
  97. dfs(); dfs2(,); build(,,n);
  98. rep(i,,m){
  99. scanf("%d%d%d%llu",&op,&x,&y,&z);
  100. if (op==) solve(x,y,z); else mdf(,,n,dfn[x],(P){y,z});
  101. }
  102. return ;
  103. }

[BZOJ4811][YNOI2017]由乃的OJ(树链剖分+线段树)的更多相关文章

  1. [BZOJ1146][CTSC2008]网络管理Network(二分+树链剖分+线段树套平衡树)

    题意:树上单点修改,询问链上k大值. 思路: 1.DFS序+树状数组套主席树 首先按照套路,关于k大值的问题,肯定要上主席树,每个点维护一棵权值线段树记录它到根的信息. 关于询问,就是Que(u)+Q ...

  2. 【BZOJ-2325】道馆之战 树链剖分 + 线段树

    2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1153  Solved: 421[Submit][Statu ...

  3. 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树

    [BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...

  4. BZOJ2243 (树链剖分+线段树)

    Problem 染色(BZOJ2243) 题目大意 给定一颗树,每个节点上有一种颜色. 要求支持两种操作: 操作1:将a->b上所有点染成一种颜色. 操作2:询问a->b上的颜色段数量. ...

  5. POJ3237 (树链剖分+线段树)

    Problem Tree (POJ3237) 题目大意 给定一颗树,有边权. 要求支持三种操作: 操作一:更改某条边的权值. 操作二:将某条路径上的边权取反. 操作三:询问某条路径上的最大权值. 解题 ...

  6. bzoj4034 (树链剖分+线段树)

    Problem T2 (bzoj4034 HAOI2015) 题目大意 给定一颗树,1为根节点,要求支持三种操作. 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子 ...

  7. HDU4897 (树链剖分+线段树)

    Problem Little Devil I (HDU4897) 题目大意 给定一棵树,每条边的颜色为黑或白,起始时均为白. 支持3种操作: 操作1:将a->b的路径中的所有边的颜色翻转. 操作 ...

  8. Aizu 2450 Do use segment tree 树链剖分+线段树

    Do use segment tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.bnuoj.com/v3/problem_show ...

  9. 【POJ3237】Tree(树链剖分+线段树)

    Description You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edg ...

  10. HDU 2460 Network(双连通+树链剖分+线段树)

    HDU 2460 Network 题目链接 题意:给定一个无向图,问每次增加一条边,问个图中还剩多少桥 思路:先双连通缩点,然后形成一棵树,每次增加一条边,相当于询问这两点路径上有多少条边,这个用树链 ...

随机推荐

  1. 关于UNIX的exec函数

    在UNIX系统中,系统为进程相关提供了一系列的控制原语,包括:进程fork,进程exit,进程exec,进程wait等服务. 该篇文章主要与进程exec服务有关,并记录了几个需要注意留意的点. 照例给 ...

  2. python3之线程与进程

    1.CPU运行原理 我们都知道CPU的根本任务就是执行指令,对计算机来说最终都是一串由“0”和“1”组成的序列.CPU从逻辑上可以划分成3个模块,分别是控制单元.运算单元和存储单元,这三部分由CPU内 ...

  3. Python标准库笔记(6) — struct模块

    该模块作用是完成Python数值和C语言结构体的Python字符串形式间的转换.这可以用于处理存储在文件中或从网络连接中存储的二进制数据,以及其他数据源. 用途: 在Python基本数据类型和二进制数 ...

  4. linux kernel的中断子系统之(三):IRQ number和中断描述符【转】

    转自:http://www.wowotech.net/linux_kenrel/interrupt_descriptor.html 一.前言 本文主要围绕IRQ number和中断描述符(interr ...

  5. DenseNet笔记

    一.DenseNet的优点 减轻梯度消失问题 加强特征的传递 充分利用特征 减少了参数量 二.网络结构公式 对于每一个DenseBlock中的每一个层, [x0,x1,…,xl-1]表示将0到l-1层 ...

  6. jupyter(ipython notebook) 安装和入门教程

    近期大家无论是自己做数据分析还是紧急答辩做PPT,可能都需要画一些数据的展示图:以前大家都是用excel画图,但excel画图存在一定的局限性,比如你要画个累积直方图,excel就很麻烦了,所以给大家 ...

  7. thinkphp模版常量替换机制

  8. CSS — 贝塞尔曲线(cubic-bezier)

    cubic-bezier 又称三次贝塞尔,主要是为 animation 生成速度曲线的函数,规定是 cubic-bezier(<x1>, <y1>, <x2>, & ...

  9. java 闭包与回调

    闭包(closure)是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域. 内部类是面向对象的闭包,因为它不仅包含外围类对象(创建内部类的作用域)的信息,还自动拥有一个指向此外围类对象 ...

  10. opencv(3)视频操作

    视频中最常用的就是从视频设备采集图片或者视频,或者读取视频文件并从中采样.所以比较重要的也是两个模块,一个是VideoCapture,用于获取相机设备并捕获图像和视频,或是从文件中捕获.还有一个Vid ...