正题

题目链接:https://www.luogu.com.cn/problem/P4092


题目大意

nnn个点的树要求支持以下操作

  1. 给一个点打上标记
  2. 求一个节点最近的打上了标记的祖先

解题思路

就是求深度最大的打上了标记的祖先,先跑一遍dfsdfsdfs序,然后对于修改操作就在线段树上整个子树的区间打一个最大值。

这里为了方便线段树就只维护了答案节点的深度,然后用倍增跑到那个节点。

时间复杂度:O(nlog⁡n):O(n\log n):O(nlogn)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
struct Tree_node{int l,r,w;
};
struct Seq_Tree{Tree_node t[N*4];void Build(int x,int l,int r){t[x].l=l;t[x].r=r;if(l==r) return;int mid=(l+r)/2;Build(x*2,l,mid);Build(x*2+1,mid+1,r);}void Change(int x,int l,int r,int w){if(t[x].l==l&&t[x].r==r){t[x].w=max(t[x].w,w);return;}int mid=(t[x].l+t[x].r)>>1;if(r<=mid) Change(x*2,l,r,w);else if(l>mid) Change(x*2+1,l,r,w);else Change(x*2,l,mid,w),Change(x*2+1,mid+1,r,w);return;}int Ask(int x,int pos){if(t[x].l==t[x].r) return t[x].w;int mid=(t[x].l+t[x].r)>>1;if(pos<=mid) return max(t[x].w,Ask(x*2,pos));else return max(t[x].w,Ask(x*2+1,pos));}
}T;
struct node{int to,next;
}a[N];
int n,Q,tot,cnt,ls[N],dep[N];
int dfn[N],ed[N],f[N][18];
void addl(int x,int y)
{a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;
}
void dfs(int x)
{dfn[x]=++cnt;for(int i=ls[x];i;i=a[i].next)dep[a[i].to]=dep[x]+1,dfs(a[i].to);ed[x]=cnt;
}
int main()
{scanf("%d%d",&n,&Q);for(int i=1;i<n;i++){int x,y;scanf("%d%d",&x,&y);addl(x,y);f[y][0]=x;}dep[1]=1;dfs(1);T.Build(1,1,n);T.Change(1,1,n,1);for(int j=1;j<18;j++)for(int i=1;i<=n;i++)f[i][j]=f[f[i][j-1]][j-1];while(Q--){char op[3];int x;scanf("%s%d",op,&x);if(op[0]=='C')T.Change(1,dfn[x],ed[x],dep[x]);else{int k=T.Ask(1,dfn[x]);for(int j=17;j>=0;j--)if(dep[f[x][j]]>=k)x=f[x][j];printf("%d\n",x);}}
}

P4092-[HEOI2016/TJOI2016]树【线段树,倍增】相关推荐

  1. 线段树分裂与合并 ----- P2824 [HEOI2016/TJOI2016]排序 [线段树分裂合并 OR 01序列排序+二分线段树]

    题目链接 题目大意: 对一个序列,每次按照升序或者降序排序序列某一段,问你最后的序列是什么? 解法1:二分+线段树 首先我们知道对一个01序列进行排序是很快的!我们只要知道里面有多少个1和多少个0,那 ...

  2. BZOJ.4552.[HEOI2016/TJOI2016]排序(线段树合并/二分 线段树)

    题目链接 对于序列上每一段连续区间的数我们都可以动态开点建一棵值域线段树.初始时就是\(n\)棵. 对于每次操作,我们可以将\([l,r]\)的数分别从之前它所属的若干段区间中分离出来,合并. 对于升 ...

  3. 树套树-线段树套平衡树

    作用 线段树的作用是区间修改和查询,平衡树的作用是查询第k大,k的排名,前驱,后继.这两个结合起来,就变成了可以区间修改和查询第k大,k的排名,前驱,后继的数据结构:树套树-线段树套平衡树. 实现 先 ...

  4. 线段树 ---- 线段树维护线段相加+滑动变长窗口 2021牛客多校第7场 F xay loves trees

    题目大意: 给你两个大小相同的树但是形状不一定一样 叫你选出最大的子集,满足下面两个条件 在第一颗树上是一条链 在第二颗树上任意两个点都不是祖先关系 解题思路: 首先我们现在第二颗树上面把每个点的df ...

  5. BZOJ 3685: 普通van Emde Boas树( 线段树 )

    建颗权值线段树就行了...连离散化都不用... 没加读入优化就TLE, 加了就A掉了...而且还快了接近1/4.... ---------------------------------------- ...

  6. 2021CCPC(桂林) - Suffix Automaton(后缀树+线段树)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的字符串,再给出 qqq 次询问,每次询问需要输出本质不同第 kkk 小的子串的起止位置.如果有多个答案,输出起点最小的那个. 本题规定字符串大小 ...

  7. 牛客 - sequence(笛卡尔树+线段树)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a 和数列 b ,求 题目分析:不算难的题目,对于每个 a[ i ] 求一下贡献然后维护最大值就好,具体思路就是,先找出每个 a[ i ] 左 ...

  8. HDU - 4417 Super Mario(主席树/线段树+离线)

    题目链接:点击查看 题目大意:给出由 n 个数的数列,再给出 m 次查询,每次查询需要输出 [ l , r ] 内小于等于 h 的数有多少个 题目分析:大晚上睡不着觉随便做做题,发现这个题目原来可以用 ...

  9. YbtOJ#752-最优分组【笛卡尔树,线段树】

    正题 题目链接:http://www.ybtoj.com.cn/problem/752 题目大意 nnn个人,每个人有cic_ici​和did_idi​分别表示这个人所在的队伍的最少/最多人数. 然后 ...

  10. P4755-Beautiful Pair【笛卡尔树,线段树】

    正题 题目链接:https://www.luogu.com.cn/problem/P4755 题目大意 nnn个数字的一个序列,求有多少个点对i,ji,ji,j满足ai×aj≤max{ak}(k∈[l ...

最新文章

  1. 操作系统的初始化流程简图
  2. 使用Docker搭建Elasticsearch6.8.6集群及设置集群用户密码
  3. 算法笔记-两数之和、三数之和、四数之和(LeetCode)
  4. 日志分析工具ELK(一)
  5. java jvm调优_(第1部分,共3部分):有关性能调优,Java中的JVM,GC,Mechanical Sympathy等的文章和视频的摘要...
  6. 【转】漫谈ANN(2):BP神经网络
  7. mac svn工具_Cornerstone 4 for mac(svn管理工具)
  8. 向量表示 运动抛物线_流动的美丽函数——抛物线浅谈
  9. (转)深入理解最强桌面地图控件GMAP.NET --- 原理篇
  10. 开课吧:深入了解人工智能在金融行业中的应用
  11. 新浪网产品设计指南(含UI规范)
  12. ISCC2021-WP合集
  13. 显卡刷bios改型号_显卡BIOS刷新方法(详细)
  14. Windows下的虚拟桌面软件——Virgo
  15. 安卓控件button添加背景图片
  16. Would you like to share anonymous usage data about this project with the Angular Team at Google unde
  17. 精伦的开发盒子USB上外挂SD卡路径
  18. 【Qt】按键事件:Alt+F4
  19. python 使用pip安装和更新包
  20. 警告:关于电磁辐射对孕妇的危害。

热门文章

  1. 修改图层的范围_【PS|第39期】数字绘画 使用填充图层
  2. 做流向图_各类型供热暖系统图大全,一饱眼福!
  3. java hdms_字段为clob类型,无法插入数据
  4. android 弹窗有边框_Android 多种简单的弹出框样式设置代码
  5. mybatis collection标签_一对多的关系,在MyBatis中如何映射?
  6. 神舟笔记本电源管理软件_笔记本电脑长期不用充不上电了?原来问题就出在这儿...
  7. 得出来的视差图左边有黑色补上原图_掌握这10个抠图方法,帮你轻松应对大部分抠图工作!(动图演示...
  8. mysql修改主键生成策略信息_常用Hibernate 主键生成策略
  9. php下载文件代码 数据库,PHP备份数据库生成SQL文件并下载的函数代码
  10. mysql数据转储方法_Mysql数据库各种导出导入数据方式的区别(我的理解错误还望指正)...