传送门

•参考资料

  [1]:CodeForces 825G Educational Round #25 G :建树选根大法+O1大法+iostream解绑了还是慢

•题意

  给定一颗包含 n 个节点的树,开始树的所有节点都是白色的;

  给出 q 次询问,询问分为1、2两种:

    1. 将节点 x 涂成黑色。
    2. 询问节点 x 到所有的黑点节点的简单路径中的标号最小的那个点(包括起点和黑点)

  题目保证第一次询问是 1 类型的。

•题解

  如果我们随便选取某节点作为根节点,那么询问的时候,我们要找到节点 x 到所有黑色节点的 LCA;

  但是这样显然会超时的,所以我们换一种建树方法。

  由于第一个询问必然是 1 类型,那么我们就把第一次询问的那个变黑的点作为根节点,看一下这样有什么好处;

  定义 $res_i$ 表示节点 i 到根节点(询问1的x)的路径中,标号最小的节点;

  首先,我们预处理出所有的 $res$,只需 $DFS$ 一遍即可,时间复杂度 $O(n)$;

  接下来,如果剩余的询问全部是 2 类型,那么,对于节点 x 的询问,直接输出 $res_x$ 即可;

  但是,如果存在 1 类型的询问呢?

  对于新的黑色节点 $u_1,u_2,.....$,在查询节点 x 的时候,除了需要知道节点 x 到根节点路径上标号最小的节点;

  同时还需要求出节点 x 到黑色节点 $u_i$ 路径上标号最小的节点;

  你会发现,求解节点 x 到黑色节点 $u_i$ 路径上的标号最小的节点等价于求解根节点到黑色节点 $u_i$ 路径上的标号最小的节点;

  那这么说的话,我们就可以定义一个变量 $Min$,用来存储新加入的黑色节点到根节点的路径上标号最小的节点信息;

  询问的时候,只需输出 $res_x$ 和 $Min$ 的最小值即可;

•Code

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define INF 0x3f3f3f3f
  4. #define mem(a,b) memset(a,b,sizeof(a))
  5. const int maxn=1e6+;
  6.  
  7. int n,q;
  8. int num;
  9. int head[maxn];
  10. struct Edge
  11. {
  12. int to;
  13. int next;
  14. }G[maxn<<];
  15. void addEdge(int u,int v)
  16. {
  17. G[num]={v,head[u]};
  18. head[u]=num++;
  19. }
  20. int res[maxn];
  21.  
  22. void DFS(int u,int f)
  23. {
  24. res[u]=min(u,res[f]);
  25. for(int i=head[u];~i;i=G[i].next)
  26. {
  27. int v=G[i].to;
  28. if(v != f)
  29. DFS(v,u);
  30. }
  31. }
  32. void Solve()
  33. {
  34. mem(res,INF);
  35.  
  36. int ans=;
  37. int Min=INF;
  38. for(int i=;i <= q;++i)
  39. {
  40. int t,z;
  41. scanf("%d%d",&t,&z);
  42. int x=(z+ans)%n+;
  43.  
  44. if(i == )
  45. DFS(x,x);
  46. else if(t == )
  47. Min=min(Min,res[x]);
  48. else
  49. {
  50. ans=min(Min,res[x]);
  51. printf("%d\n",ans);
  52. }
  53. }
  54. }
  55. void Init()
  56. {
  57. num=;
  58. mem(head,-);
  59. }
  60. int main()
  61. {
  62. Init();
  63. scanf("%d%d",&n,&q);
  64. for(int i=;i < n;++i)
  65. {
  66. int u,v;
  67. scanf("%d%d",&u,&v);
  68. addEdge(u,v);
  69. addEdge(v,u);
  70. }
  71. Solve();
  72.  
  73. return ;
  74. }

CodeForces 825G"Tree Queries"(选根建树)的更多相关文章

  1. AC日记——825G - Tree Queries

    825G - Tree Queries 思路: 神题,路径拆成半链: 代码: #include <cstdio> #include <cstring> #include < ...

  2. Codeforces 1606F - Tree Queries(虚树+树形 dp)

    Codeforces 题面传送门 & 洛谷题面传送门 显然我们选择删除的点连同 \(u\) 会形成一个连通块,否则我们如果选择不删除不与 \(u\) 在同一连通块中的点,答案一定更优. 注意到 ...

  3. Codeforces 960D - Full Binary Tree Queries

    960D - Full Binary Tree Queries 思路: 用move1[i]记录第i层第1种操作移动的个数(对这一层的个数取模) 用move2[i]记录第i层第2种操作移动的个数(对这一 ...

  4. [Codeforces 266E]More Queries to Array...(线段树+二项式定理)

    [Codeforces 266E]More Queries to Array...(线段树+二项式定理) 题面 维护一个长度为\(n\)的序列\(a\),\(m\)个操作 区间赋值为\(x\) 查询\ ...

  5. CF1328E Tree Queries

    CF1328E Tree Queries 应该还是比较妙的 题意 给你一个树,然后多次询问 每次询问给出一堆节点,问你是否能找到一个从根出发的链,是的对于给出的每个节点,都能找出链上的点,是的他们的距 ...

  6. CF-1328 E. Tree Queries

    E. Tree Queries 题目链接 题意 给定一个树,每次询问一组点,问是否存在一条从根到某点的路径,使得该组点到该路径的最短距离不超过1 分析 从根到达某点的路径,如果覆盖到了某个点,那么一定 ...

  7. [Codeforces]817F. MEX Queries 离散化+线段树维护

    [Codeforces]817F. MEX Queries You are given a set of integer numbers, initially it is empty. You sho ...

  8. E. Tree Queries 解析(思維、LCA)

    Codeforce 1328 E. Tree Queries 解析(思維.LCA) 今天我們來看看CF1328E 題目連結 題目 給你一棵樹,並且給你\(m\le2e5\)個詢問(包含\(k\)個點) ...

  9. Codeforces1695 D1.+D2 Tree Queries

    题意 给一个n个点的无向图,其中有一个隐藏点X,可以进行一组询问S来确定S是n个节点中的哪个点.S包括k个询问节点.询问返回的值也为k个值,每个值为X点到每个询问节点的最短路距离,求k最小为多少. 提 ...

随机推荐

  1. oracle-ASM存储器

    自动存储管理 Oracle 10g引进的一种新型存储机制.它依靠oracle来维护企业的数据库存储器,被设计用来解除磁盘和存储器管理的负担,可以使用ASM来定义用于文件管理的磁盘组. 磁盘组类似于某些 ...

  2. BZOJ2770: YY的Treap

    原本看标题还以为是treap的题,但是实际上是线段树. 求两点的LCA相当于求区间priority最小值的位置. 然后就可以离线先离散化然后建树做了. 记录的minpos是线段树上叶子结点的节点编号. ...

  3. C++之以分隔符的形式获取字符串

    void CConvert::Split(const std::string& src, const std::string& separator, std::vector<st ...

  4. @Transactional注解事务

    打了这个注解的类或者方法表示该类里面的所有方法或者这个方法的事务由spring处理,来保证事务的原子性,即方法里面对数据库操作,如果失败则spring负责回滚操作,成功提交操作 一.特性 1.serv ...

  5. 原生js分页

    <html> <head> <meta charset='utf-8'> <style type="text/css"> #idDa ...

  6. oracle-Restrict权限

    启动数据库并把它置于open模式,直给拥有restricted session权限的用户赋予访问权. Alter system disable restricted session; 另外,启动时,o ...

  7. material-ui里面的withStyles是什么?

    export default withStyles(styles, { name: 'MuiAppBar' })(AppBar); //这里的作用是什么? withStyles 是一个 HOC 组件, ...

  8. shell脚本练习题(更新中...)

    练习题(这里贴的是自己写的代码, 网上给的题目代码我会附加在最下面) 1. 编写shell脚本,计算1-100的和: #!/bin/bash #caculate the to `; do sum=$[ ...

  9. jQuery第3天

    复习 如何区别 JS DOM对象和 JQ 包装对象? JQ对象其实是经过包装的DOM对象,包装后可调用 JQ 的方法. JS 对象基本上都是属性为主,JQ基本上都方法为主. 可通过 console.d ...

  10. F4NNIU 整理的 docker-compose 几个常用命令

    F4NNIU 整理的 docker-compose 几个常用命令 up 创建并启动一个容器. 记录一下,如果已经有容器,up 和 start 都可以启动容器,up 可以看到调试窗口,但是 start ...