Link

  https://jzoj.net/senior/#main/show/5257

Problem

Solution

5~90分

  我们可以根据特殊性质搞

  如果数据小,直接暴力在树上面模拟一次

  如果满足性质1,就是第i条边连i和i+1地,那么就成了一条链,答案是可以按照数学方法计算出来的

  如果满足性质2,就是A=C,那么就是A~B的长度,可以预处理快速求出来

  这些分数,感谢出题人的馈赠

100分

  其实我们可以画个图,粗略的画个图,看看答案是什么

  

  显然,根据这个图,我们就知道,答案其实就是BX这条线段的长度

  怎么求?我们可以用最简单的容斥原理

  

  加一是因为X这个点之后要div2,所以应该得被计算2次

  我们发现,求AB,CB,AC的方法,都是求他们到lca的长度

  所以,我们可以用倍增,对他们做lca,并且记录路径长度

  我们一次递归,预处理出,每个点的深度。

  在递归中,顺便预处理f数组

  其中f[i,j]表示第i个节点,在他上面第2j个节点是什么。

  我们先把深度大的点,用倍增,弄成和另外一个节点一样的深度,这个和下面的方法类似

  然后同时倍增。

  其实就是找一个最大的j,满足f[a,j]不等于f[b,j],一直弄,最后就成了lca的两个儿子。

  加法随便弄一下就行了。

  其他两个求法类似,不在赘述了。

  时间复杂度:O(3n)(n表示点数)

Code

  1. {$inline on}
  2. var
  3. n,m,i,j,x,y,z,tot:longint;
  4. f:array[..,..] of longint;
  5. pre,l,d:array[..] of longint;
  6. dis,shen:array[..] of longint;
  7. procedure insert(x,y:longint); inline;
  8. begin
  9. inc(tot);
  10. d[tot]:=y;
  11. pre[tot]:=l[x];
  12. l[x]:=tot;
  13. end;
  14.  
  15. procedure dg(now,k,q:longint); inline;
  16. var
  17. s:longint;
  18. begin
  19. shen[now]:=k;
  20. f[now,]:=q;
  21. s:=l[now];
  22. while s<> do
  23. begin
  24. if dis[d[s]]= then
  25. begin
  26. dis[d[s]]:=;
  27. dg(d[s],k+,now);
  28. end;
  29.  
  30. s:=pre[s];
  31. end;
  32. end;
  33.  
  34. function yes(x,y:longint):longint; inline;
  35. var
  36. ans,k:longint;
  37. begin
  38. ans:=;
  39. if shen[x]>shen[y] then
  40. begin
  41. while shen[x]>shen[y] do
  42. begin
  43. for k:= downto do
  44. if shen[f[x,k]]>=shen[y] then
  45. break;
  46.  
  47. x:=f[x,k];
  48. ans:=ans+ shl k;
  49. end;
  50. end;
  51.  
  52. if shen[x]<shen[y] then
  53. begin
  54. while shen[x]<shen[y] do
  55. begin
  56. for k:= downto do
  57. if shen[f[y,k]]>=shen[x] then
  58. break;
  59.  
  60. y:=f[y,k];
  61. ans:=ans+ shl k;
  62. end;
  63. end;
  64.  
  65. while x<>y do
  66. begin
  67. for k:= downto do
  68. if (f[x,k]<>f[y,k]) and (f[x,k]<>) and (f[y,k]<>) then
  69. break;
  70.  
  71. x:=f[x,k];
  72. y:=f[y,k];
  73. ans:=ans+ shl (k+);
  74. end;
  75.  
  76. exit(ans);
  77. end;
  78.  
  79. begin
  80. readln(n,m,x);
  81. for i:= to n- do
  82. begin
  83. readln(x,y);
  84.  
  85. insert(x,y);
  86. insert(y,x);
  87. end;
  88.  
  89. dis[]:=;
  90. shen[]:=-maxlongint;
  91. dg(,,);
  92.  
  93. for j:= to do
  94. for i:= to n do
  95. f[i,j]:=f[f[i,j-],j-];
  96.  
  97. while m> do
  98. begin
  99. readln(x,y,z);
  100.  
  101. writeln((yes(x,y)+yes(y,z)-yes(x,z)+) shr );
  102.  
  103. dec(m);
  104. end;
  105. end.

[jzoj]5257.小X的佛光的更多相关文章

  1. JZOJ 5257. 小X的佛光 (Standard IO)

    5257. 小X的佛光 (Standard IO) Time Limits: 2000 ms Memory Limits: 524288 KB Description Input Output Sam ...

  2. JZOJ.5257【NOIP2017模拟8.11】小X的佛光

    Description

  3. 计蒜客NOIP模拟赛4 D1T3 小X的佛光

    小 X 是远近闻名的学佛,平日里最喜欢做的事就是蒸发学水. 小 X 所在的城市 X 城是一个含有 N 个节点的无向图,同时,由于 X 国是一个发展中国家,为了节约城市建设的经费,X 国首相在建造 X ...

  4. 常州模拟赛d2t3 小X的佛光

    平日里最喜欢做的事就是蒸发学水.[题目描述]小 X 所在的城市 X 城是一个含有 N 个节点的无向图,同时,由于 X 国是一个发展中国家,为了节约城市建设的经费,X 国首相在建造 X 城时只建造 N ...

  5. [JZOJ] 5935. 小凯学数学

    由Noip2018初赛的知识得,a|b + a&b = a+b 设计一个区间dp,设\(f[l][r][x]\)表示区间\([l,r]\)能否构成\(x\),数据不大,转移暴力枚举 复杂度\( ...

  6. 计蒜客NOIP2017提高组模拟赛(四)day1

    T1:小X的质数 小 X 是一位热爱数学的男孩子,在茫茫的数字中,他对质数更有一种独特的情感.小 X 认为,质数是一切自然数起源的地方. 在小 X 的认知里,质数是除了本身和 1 以外,没有其他因数的 ...

  7. JZOJ 5777. 【NOIP2008模拟】小x玩游戏

    5777. [NOIP2008模拟]小x玩游戏 (File IO): input:game.in output:game.out Time Limits: 1000 ms  Memory Limits ...

  8. JZOJ 5793. 【NOIP2008模拟】小S练跑步

    5793. [NOIP2008模拟]小S练跑步 (File IO): input:run.in output:run.out Time Limits: 2000 ms  Memory Limits:  ...

  9. JZOJ 5776. 【NOIP2008模拟】小x游世界树

    5776. [NOIP2008模拟]小x游世界树 (File IO): input:yggdrasil.in output:yggdrasil.out Time Limits: 1500 ms  Me ...

随机推荐

  1. Hadoop ConnectTimeoutException

    晚上继续学习tfidf示例.在跑TwoJob的时候报如下错误,开始以为是node02的防火墙没关好,但看了一下防火墙确实是关了的. 2019-03-30 23:48:19,705 INFO retry ...

  2. 小甲鱼python基础教程飞机大战源码及素材

    百度了半天小甲鱼python飞机大战的源码和素材,搜出一堆不知道是什么玩意儿的玩意儿. 最终还是自己对着视频一行行代码敲出来. 需要的同学点下面的链接自取. 下载

  3. [转]Oh My Zsh,安装,主题配置

    https://swp-song.com/2017/08/20/Tools/OhMyZsh%E5%AE%89%E8%A3%85%E5%92%8C%E4%B8%BB%E9%A2%98%E9%85%8D% ...

  4. Spring Security 架构与源码分析

    Spring Security 主要实现了Authentication(认证,解决who are you? ) 和 Access Control(访问控制,也就是what are you allowe ...

  5. Python 携程

    一.协程 1.又称微线程,纤程.英文名Coroutine.一句话说明什么是协程:协程是一种用户态的轻量级线程(相当于操作系统不知道它的存在,是用户控制的). 2.协程拥有自己的寄存器上下文和栈(代码的 ...

  6. ELK使用1-Elasticsearch使用

    一.es 1.通过curl命令获取es进群信息 a.curl -i(设置协议的头信息) -XGET 'http:192.168.30.41:9200/_count' b.查看集群状态 curl -XG ...

  7. oracle中计算百分比,并同时解决小数点前0不显示的问题

    select a.catalog_name,decode(substr(trunc((a.s/b.count2),4)*100||'%',0,1),'.',replace(trunc((a.s/b.c ...

  8. 使用 PySide2 开发 Maya 插件系列三:qt语言国际化(internationalization)

    使用 PySide2 开发 Maya 插件系列三:qt语言国际化(internationalization) 前言: 这是 qt for python 的语言国际化,基于 UI 的,python 也有 ...

  9. soul

    mark,数据使用gzip加密,因为公司网络卡,明天后天看.

  10. PostgreSQL 创建触发器 Trigger

    触发器的知识点: PostgreSQL在以下情况下执行/调用触发器:在尝试操作之前(在检查约束并尝试INSERT,UPDATE或DELETE之前).或者在操作完成后(在检查约束并且INSERT,UPD ...