传送门

LCT秒天秒地

树剖比较裸的题了

用线段树记录一下区间的最左边的黑点的编号(因为同一条链上肯定是最左边的深度最小,到根节点距离最近)

然后记得树剖的时候肯定是越后面的答案越优,因为深度越浅

  1. //minamoto
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
  5. char buf[<<],*p1=buf,*p2=buf;
  6. inline int read(){
  7. #define num ch-'0'
  8. char ch;bool flag=;int res;
  9. while(!isdigit(ch=getc()))
  10. (ch=='-')&&(flag=true);
  11. for(res=num;isdigit(ch=getc());res=res*+num);
  12. (flag)&&(res=-res);
  13. #undef num
  14. return res;
  15. }
  16. char sr[<<],z[];int C=-,Z;
  17. inline void Ot(){fwrite(sr,,C+,stdout),C=-;}
  18. inline void print(int x){
  19. if(C><<)Ot();if(x<)sr[++C]=,x=-x;
  20. while(z[++Z]=x%+,x/=);
  21. while(sr[++C]=z[Z],--Z);sr[++C]='\n';
  22. }
  23. const int N=1e5+;
  24. int head[N],Next[N<<],ver[N<<],tot;
  25. inline void add(int u,int v){
  26. ver[++tot]=v,Next[tot]=head[u],head[u]=tot;
  27. }
  28. int dfn[N],sz[N],son[N],fa[N],bl[N],val[N],top[N],cnt,n,m;
  29. void dfs1(int u){
  30. sz[u]=;
  31. for(int i=head[u];i;i=Next[i]){
  32. int v=ver[i];
  33. if(v!=fa[u]){
  34. fa[v]=u,dfs1(v),sz[u]+=sz[v];
  35. if(sz[son[u]]<sz[v]) son[u]=v;
  36. }
  37. }
  38. }
  39. void dfs2(int u,int t){
  40. dfn[u]=++cnt,bl[cnt]=u,top[u]=t;
  41. if(son[u]){
  42. dfs2(son[u],t);
  43. for(int i=head[u];i;i=Next[i]){
  44. int v=ver[i];
  45. if(v!=fa[u]&&v!=son[u]) dfs2(v,v);
  46. }
  47. }
  48. }
  49. int mx[N<<];
  50. #define ls (p<<1)
  51. #define rs (p<<1|1)
  52. inline void upd(int p){
  53. mx[p]=mx[ls]?mx[ls]:mx[rs];
  54. }
  55. void build(int p,int l,int r){
  56. if(l==r) return (void)(mx[p]=val[bl[l]]?bl[l]:);
  57. int mid=(l+r)>>;
  58. build(ls,l,mid),build(rs,mid+,r);
  59. upd(p);
  60. }
  61. void update(int p,int l,int r,int x){
  62. if(l==r) return (void)(mx[p]=val[bl[l]]?bl[l]:);
  63. int mid=(l+r)>>;
  64. x<=mid?update(ls,l,mid,x):update(rs,mid+,r,x);
  65. upd(p);
  66. }
  67. int query(int p,int l,int r,int ql,int qr){
  68. if(ql<=l&&qr>=r) return mx[p];
  69. int mid=(l+r)>>,res=;
  70. if(ql<=mid&&(res=query(ls,l,mid,ql,qr))) return res;
  71. if(qr>mid&&(res=query(rs,mid+,r,ql,qr))) return res;
  72. return ;
  73. }
  74. inline void change(int i){
  75. val[i]^=,update(,,n,dfn[i]);
  76. }
  77. inline int get(int u){
  78. int res=,p;
  79. while(top[u]!=){
  80. p=query(,,n,dfn[top[u]],dfn[u]);
  81. p?res=p:;
  82. u=fa[top[u]];
  83. }
  84. p=query(,,n,,dfn[u]);p?res=p:;
  85. return res?res:-;
  86. }
  87. int main(){
  88. // freopen("testdata.in","r",stdin);
  89. n=read(),m=read();
  90. for(int i=,u,v;i<n;++i)
  91. u=read(),v=read(),add(u,v),add(v,u);
  92. dfs1(),dfs2(,),build(,,n);
  93. while(m--){
  94. int op=read(),u=read();
  95. op&?print(get(u)):change(u);
  96. }
  97. Ot();
  98. return ;
  99. }

洛谷P4116 Qtree3(树剖+线段树)的更多相关文章

  1. 洛谷P4315 月下“毛景树”(树剖+线段树)

    传送门 woc这该死的码农题…… 把每一条边转化为它连接的两点中深度较深的那一个,然后就可以用树剖+线段树对路径进行修改了 然后顺便注意在上面这种转化之后,树剖的时候不能搞$LCA$ 然后是几个注意点 ...

  2. 洛谷 P3373 【模板】线段树 2

    洛谷 P3373 [模板]线段树 2 洛谷传送门 题目描述 如题,已知一个数列,你需要进行下面三种操作: 将某区间每一个数乘上 xx 将某区间每一个数加上 xx 求出某区间每一个数的和 输入格式 第一 ...

  3. BZOJ_2238_Mst_树剖+线段树

    BZOJ_2238_Mst_树剖+线段树 Description 给出一个N个点M条边的无向带权图,以及Q个询问,每次询问在图中删掉一条边后图的最小生成树.(各询问间独立,每次询问不对之后的询问产生影 ...

  4. BZOJ_4551_[Tjoi2016&Heoi2016]树_树剖+线段树

    BZOJ_4551_[Tjoi2016&Heoi2016]树_树剖+线段树 Description 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为 ...

  5. BZOJ_2157_旅游_树剖+线段树

    BZOJ_2157_旅游_树剖+线段树 Description Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但 ...

  6. 【BZOJ5210】最大连通子块和 树剖线段树+动态DP

    [BZOJ5210]最大连通子块和 Description 给出一棵n个点.以1为根的有根树,点有点权.要求支持如下两种操作: M x y:将点x的点权改为y: Q x:求以x为根的子树的最大连通子块 ...

  7. [LNOI2014]LCA(树剖+线段树)

    \(\%\%\% Fading\) 此题是他第一道黑题(我的第一道黑题是蒲公英) 一直不敢开,后来发现是差分一下,将询问离线,树剖+线段树维护即可 \(Code\ Below:\) #include ...

  8. [CF1007D]Ants[2-SAT+树剖+线段树优化建图]

    题意 我们用路径 \((u, v)\) 表示一棵树上从结点 \(u\) 到结点 \(v\) 的最短路径. 给定一棵由 \(n\) 个结点构成的树.你需要用 \(m\) 种不同的颜色为这棵树的树边染色, ...

  9. LOJ#3088. 「GXOI / GZOI2019」旧词(树剖+线段树)

    题面 传送门 题解 先考虑\(k=1\)的情况,我们可以离线处理,从小到大对于每一个\(i\),令\(1\)到\(i\)的路径上每个节点权值增加\(1\),然后对于所有\(x=i\)的询问查一下\(y ...

  10. BZOJ3531-[Sdoi2014]旅行(树剖+线段树动态开点)

    传送门 完了今天才知道原来线段树的动态开点和主席树是不一样的啊 我们先考虑没有宗教信仰的限制,那么就是一个很明显的树剖+线段树,路径查询最大值以及路径和 然后有了宗教信仰的限制该怎么做呢? 先考虑暴力 ...

随机推荐

  1. poj——3177Redundant Paths

    poj——3177Redundant Paths      洛谷—— P2860 [USACO06JAN]冗余路径Redundant Paths Time Limit: 1000MS   Memory ...

  2. [Bzoj1297][Scoi2009 ]迷路 (矩阵乘法 + 拆点)

    1297: [SCOI2009]迷路 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1385  Solved: 993[Submit][Status] ...

  3. codeforces 873E(枚举+rmq)

    题意 有n(n<=3000)个人参与acm比赛,每个人都有一个解题数,现在要决定拿金牌的人数cnt1,拿银牌的人数cnt2,拿铜牌的人数cnt3,各自对应一个解题数区间[d1,c1],[d2,c ...

  4. css三大布局

    标准流: 从左到右,从上到下块级元素独占一行,行内元素碰到父盒子边缘换行 浮动: 特点 1 元素浮动之后不占据原来的位置(脱标),变成立体,下面可以有东西,只影响下面的 2 浮动的盒子在一行上显示 3 ...

  5. ios开发 MPMoviePlayerController 视频播放器

    项目中用到视频播放功能, 写点视频基础部分 MPMoviePlayerController是通过MediaPlayer.frame引入的,可用于播放在iOS支持的所有格式的视频,用起来很简单!!! M ...

  6. 基于RTP的h.264视频传输系统设计(一)

    一.H.264 的层次介绍 H.264 定义三个层次,每一个层次支持一组特定的编码功能.而且按照各个层次指定所指定的功能.基础层次(baselineprofile)支持I 帧和 P 帧[1]的帧内和帧 ...

  7. Zookeeper中的FastLeaderElection选举算法简述

    Zookeeper是一个开源的分布式应用协调项目, 当中为了保证各节点的协同工作,Zookeeper在工作时须要有一个Leader. 而Leader是怎样被选举出来的?Zookeep中使用的缺省算法称 ...

  8. 安装和配置Apache-tomcat

    https://tomcat.apache.org/download-90.cgi 我随便下载了一个,而且解压了 我把路径:G:\php\apache-tomcat-9.0.6\bin 放入path, ...

  9. 在XX公司工作第二天,维护已有代码

    根据<C++ More Exception>所述的规则: Rule #1: Never write using-directives in header files. Rule #2: N ...

  10. 微信通过openID发送消息/后台post、get提交并接收数据 C# .NET 配置404,500等错误信息 连接字符串

    微信通过openID发送消息/后台post.get提交并接收数据   控制器:下面是post发送消息(微信不支持从前台发送数据,之前试过,报错,需要跨域,跨域的问题解决后还不行,最后发现之后后端提交 ...