原oj题面

Time limit 2000 ms

Memory limit 1572864 kB

Code length Limit 50000 B

OS Linux

Language limit All except: ERL JS-RHINO NODEJS PERL6 VB.NET //c++呢?Java呢?Python呢?明明可以的

Source VNOI Marathon '08 - Round 6/DivA Problem Setter: Blue Mary

Author Fudan University Problem Setters

吐槽

两年后写的第二篇树剖,还是找了一两天的bug,最后发现,dfs1()里,if(v==t[u].fa) continue;被我写成了if(v==t[u].fa) return;。这样例里的树好像也不水了……而且我记得之前把建好的树输出,也没发现树上少了哪个点来着……不知道这个错误发生之前是不是有其他什么bug……

[HAOI2015]树上操作 这篇的操作3也是从根节点到给定点这一路的修改,我当年还觉得那时自己想的优化(因为一个点已经固定为根节点1,所以跳链时不用比较两条链顶端的深度,只需要下面那个点不停向上到达根就好)挺不错来着,结果现在发现只是那常规操作……

板子没有解题思路

源代码

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. int T;
  5. int n,q;
  6. //对于每个黑色点,线段树上的值对应点的新id
  7. //对于每个白色点,线段树上的值为inf
  8. struct Edge{
  9. int nxt,to;
  10. }e[200010];
  11. int cnt=1,head[100010];
  12. void add(int u,int v)
  13. {
  14. e[cnt]={head[u],v};
  15. head[u]=cnt++;
  16. e[cnt]={head[v],u};
  17. head[v]=cnt++;
  18. }
  19. struct Tree{
  20. int fa,dep,sz,wson;
  21. int id,top;
  22. }t[100010];
  23. void dfs1(int u,int fa)
  24. {
  25. t[u].fa=fa;
  26. t[u].dep=t[fa].dep+1;
  27. t[u].sz=1;
  28. int maxn=-1;
  29. for(int i=head[u];i;i=e[i].nxt)
  30. {
  31. int v=e[i].to;
  32. if(v==fa) continue;//就是这里,之前写成return了
  33. dfs1(v,u);
  34. int temp=t[v].sz;
  35. t[u].sz+=temp;
  36. if(temp>maxn)
  37. {
  38. maxn=temp;
  39. t[u].wson=v;
  40. }
  41. }
  42. }
  43. int id=1;
  44. int mp[100010];//用新的id查询老的id
  45. void dfs2(int u,int top)
  46. {
  47. t[u].top=top;
  48. mp[id]=u;
  49. t[u].id=id++;
  50. if(t[u].sz==1) return;
  51. dfs2(t[u].wson,top);
  52. for(int i=head[u];i;i=e[i].nxt)
  53. {
  54. int v=e[i].to;
  55. if(v==t[u].wson||v==t[u].fa) continue;
  56. dfs2(v,v);
  57. }
  58. }
  59. const int inf=0x7f7f7f7f;
  60. struct Segtree{
  61. int l,r;//有点想改变码风,把这两个放到参数里去,以便和主席树统一
  62. int mn;
  63. }s[400010];
  64. void build(int x,int l,int r)
  65. {
  66. s[x]={l,r,inf};
  67. if(l==r) return;
  68. int mid=l+r>>1;
  69. build(x<<1,l,mid);
  70. build(x<<1|1,mid+1,r);
  71. }
  72. void update(int x,int pos)
  73. {
  74. if(s[x].l==s[x].r&&s[x].l==pos)
  75. {
  76. if(s[x].mn==inf)//染成黑色
  77. s[x].mn=pos;//赋值成新的id
  78. else//染成白色
  79. s[x].mn=inf;
  80. return;
  81. }
  82. int mid=s[x].l+s[x].r>>1;
  83. if(pos<=mid) update(x<<1,pos);
  84. else update(x<<1|1,pos);
  85. s[x].mn=std::min(s[x<<1].mn,s[x<<1|1].mn);
  86. }
  87. int que(int x,int l,int r)//返回所求点新id
  88. {
  89. if(l<=s[x].l&&s[x].r<=r)
  90. return s[x].mn;
  91. int mid=s[x].l+s[x].r>>1;
  92. int ans=inf;
  93. if(l<=mid) ans=std::min(ans,que(x<<1,l,r));
  94. if(r>mid) ans=std::min(ans,que(x<<1|1,l,r));
  95. return ans;
  96. }
  97. void opt0(int u)//改变u号点颜色
  98. {
  99. update(1,t[u].id);
  100. }
  101. int opt1(int u)//返回1到u的第一个黑点的老id
  102. {
  103. int ans=inf;
  104. while(u)
  105. {
  106. ans=std::min(ans,que(1,t[t[u].top].id,t[u].id));
  107. u=t[t[u].top].fa;
  108. }
  109. if(ans==inf) ans=-1;
  110. else ans=mp[ans];
  111. return ans;
  112. }
  113. int main()
  114. {
  115. //freopen("test.in","r",stdin);
  116. scanf("%d%d",&n,&q);
  117. for(int i=1,u,v;i<n;i++)
  118. {
  119. scanf("%d%d",&u,&v);
  120. add(u,v);
  121. }
  122. dfs1(1,0);
  123. dfs2(1,1);
  124. build(1,1,n);
  125. while(q--)
  126. {
  127. int opt,u;
  128. scanf("%d%d",&opt,&u);
  129. if(opt) printf("%d\n",opt1(u));
  130. else opt0(u);
  131. }
  132. return 0;
  133. }

SPOJ 2798 QTREE3 - Query on a tree again!的更多相关文章

  1. SPOJ VJudge QTREE - Query on a tree

    Query on a tree Time Limit: 851MS   Memory Limit: 1572864KB   64bit IO Format: %lld & %llu Submi ...

  2. SPOJ QTREE3 - Query on a tree again!

    You are given a tree (an acyclic undirected connected graph) with N nodes. The tree nodes are number ...

  3. SPOJ QTREE3 Query on a tree again! ——Link-Cut Tree

    [题目分析] QTREE2,一看是倍增算法,太懒了,不写了.( ̄_, ̄ ) QTREE3,树链剖分可以做,发现链上的问题LCT也很好做. 要是子树问题貌似可以DFS序. 然后就成LCT模板题了. 考前 ...

  4. 【SPOJ】375. Query on a tree(树链剖分)

    http://www.spoj.com/problems/QTREE/ 这是按边分类的. 调试调到吐,对拍都查不出来,后来改了下造数据的,拍出来了.囧啊啊啊啊啊啊 时间都花在调试上了,打hld只用了半 ...

  5. spoj 375 QTREE - Query on a tree 树链剖分

    题目链接 给一棵树, 每条边有权值, 两种操作, 一种是将一条边的权值改变, 一种是询问u到v路径上最大的边的权值. 树链剖分模板. #include <iostream> #includ ...

  6. SPOJ 375 QTREE - Query on a tree

    思路 注意本题只能用C,不能用C++ 其他的都和上一题一样 代码 #include <stdio.h> #include <string.h> #define MAXN 100 ...

  7. 树链剖分【p4116】Qtree3 - Query on a tree

    Description 给出N个点的一棵树(N-1条边),节点有白有黑,初始全为白 有两种操作: 0 i : 改变某点的颜色(原来是黑的变白,原来是白的变黑) 1 v : 询问1到v的路径上的第一个黑 ...

  8. Spoj 2798 Qtree3

    一棵结点为黑色或白色的树,初始都是白色的.有两种操作 1 将一个结点换颜色 2 询问从根到结点u路径上面的第一个黑色点,没有则输出-1 InputIn the first line there are ...

  9. SPOJ 16549 - QTREE6 - Query on a tree VI 「一种维护树上颜色连通块的操作」

    题意 有操作 $0$ $u$:询问有多少个节点 $v$ 满足路径 $u$ 到 $v$ 上所有节点(包括)都拥有相同的颜色$1$ $u$:翻转 $u$ 的颜色 题解 直接用一个 $LCT$ 去暴力删边连 ...

随机推荐

  1. 【ABAP系列】SAP 面试 ABAPer的一些感想

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP 面试 ABAPer的一些 ...

  2. 手动设计神经网络进行MNIST分类

    前言: 用手工设计的两层神经网络,经过200个epoch,最后得到0.9599,约0.96的精度 正文 import tensorflow as tf from tensorflow.examples ...

  3. python+selenium下载文件——firefox

    修改Firefox的相关配置. 1.profile.set_preference('browser.download.folderList',2) 设置成0代表桌面,1代表下载到浏览器默认下载路径:2 ...

  4. 文档压缩 | gzip、bzip2、xz

    6.文档的压缩与打包 Linux下常见后缀名所对应的的压缩工具 .gz 表示由gzip压缩工具压缩的文件 .bz2 表示由bzip2压缩工具压缩的文件 .tar 表示由tar打包程序打包的文件(tar ...

  5. C#获取当前路径7中方法

    //获取模块的完整路径. string path1 = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName; //获取 ...

  6. Oracle Replace函数的简单使用

      REPLACE ( char, search_string [, replace_string]) 如果没有指定replace_string 变量的值,那么当发现search_string 变量的 ...

  7. CentOS 8 下 nginx 服务器安装及配置笔记

    参考文档 nginx官方文档 安装 在CentOS下,nginx官方提供了安装包可以安装 首先先安装前置软件 sudo yum install yum-utils 然后将nginx官方源加入到yum源 ...

  8. 洛谷 P1631 序列合并(优先队列)

    传送门 解题思路 首先读入a.b数组后,sort一遍(从小到大),然后把a[1]+b[1],a[2]+b[1],a[3]+b[1]……a[n]+b[1]全部加入一个优先队列q(小根堆). 然后从一到n ...

  9. django学习笔记(四)

    1.请求周期 url> 路由 > 函数或类 > 返回字符串或者模板语言? Form表单提交: 提交 -> url > 函数或类中的方法 - .... HttpRespon ...

  10. JSP中九大内置对象及其作用

    jsp中有九大内置对象分别为:request,response,session,application,out,pageContext,page,config,exception. request:请 ...