2098. [SYOI 2015] Asm.Def的病毒

★☆   输入文件:asm_virus.in   输出文件:asm_virus.out   简单对比
时间限制:1 s   内存限制:256 MB

【题目描述】

“这就是我们最新研制的,世界上第一种可持久化动态计算机病毒,‘创世纪’。”方教授介绍道。

“哦。”主席面无表情地点点头。

“‘创世纪’无法真正杀死透明计算网络,但是可以把它变成傻子。可惜透明计算网络能轻松地辨认出病毒,所以我建议……”

“为什么不伪装呢?”Asm.Def说。

“当然不行,它比我们更懂伪装。”

“我是说,把我们的病毒伪装成杀毒软件。”

方教授震惊地盯着Asm.Def看了一会。“你是个天才。”

Asm.Def想把病毒伪装成杀毒软件,入侵透明计算网络。透明计算网络的文件结构是一棵N个节点的树,每个病毒可以入侵一条路径上的所有节点。但如果两个病毒入侵了同一个节点,由于它们伪装成了杀毒软件,就会自相残杀。Asm.Def不希望这样的情况发生,所以他需要仔细制定入侵计划。为此,他需要频繁地询问,两条路径是否经过同一个节点(即是否相交)。

【输入格式】

第一行两个整数N,Q。

接下来N-1行,每行两个整数a,b,表示(a,b)是树上的一条边。

接下来Q行,每行四个整数s1,t1,s2,t2,表示询问s1~t1的路径是否与s2~t2的路径相交。

【输出格式】

对每个询问,若相交则输出一行”YES”,否则输出一行”NO”。

【样例输入】

  1. 6 5
  2. 1 2
  3. 1 3
  4. 2 4
  5. 4 5
  6. 4 6
  7. 1 1 5 6
  8. 1 2 6 3
  9. 2 3 5 6
  10. 6 4 3 1
  11. 4 3 1 2

【样例输出】

  1. NO
  2. YES
  3. NO
  4. NO
  5. YES

【提示】

N,Q<=1000.

1<=s1,t1,s2,t2<=N。

【来源】

“Asm.Def战记之夏威夷”杯

这一题的题面看起来可真是好玩啊

这一道题真是一个神奇的题

题意就是判断一下两条路径是否相交 而且还要多次询问 所以必须要有一格效率很高的方法 不能暴力

这一道题的标签看起来好可怕!LCA!???满脸疑惑

哈哈↑↑题面都在斗图 我也来一个

所以这一道题到底跟LCA有什么关系呢?

。。。。(沉默中)

我默默地翻了一下别人的代码

终于发现了奥妙所在

别急别急 我们来看一个图吧(本图借用自weixin_34362991

这一道题的思路是这个样子的

就是说有两条路径 2-6   and   5-3  很显然是相交的 (看到那个3了吗!!!)

首先我们把能看到的lca瞅一遍

lca(2,6)=1

lca(3,5)=6

很显然这个时候6的深度是要比1的深度要大的

那我们就取6为"LLCCAA"

LLCCAA和2的lca是1

LLCCAA和6的lca是6

这个6和LLCCAA相等 所以他们是相交的 (好神奇!?)

其实也肥肠好理解

就是说这条lca更深的路径的lca 与 较浅的路径的两个端点的lca如果有其中的任何一个与更深路径的两个端点的lca的lca等于更深路径两个端点的lca  就是香蕉了

也就是说 相当于这一条更浅得路延伸到了这条更深的路的lca的下面   也就是相交了嘛

(↑是不是很简单)

自己结合那个图觉悟一会就明白了哦

太开心了!3分钟A样例 随之AC~(尽管树链剖分那一段是复制的 啦啦啦(~ ̄▽ ̄)~)

本人拙见如有疏漏之处敬请指正

代码如下 树链剖分一波:

  1. #include<bits/stdc++.h>
  2. #define maxn 1005
  3. using namespace std;
  4. int n,Ques;
  5. vector<int> v[maxn];
  6. int size[maxn],dfn[maxn],pos[maxn],vis[maxn],fa[maxn],son[maxn],top[maxn],dep[maxn];
  7. int cnt=;
  8. void Dfs(int x)
  9. {
  10. size[x]=;//首先以x为根的子树的大小size 先设为1 就是目前已x为根的子树只有x自己
  11. for(int i=;i<v[x].size();i++)
  12. {
  13. int y=v[x][i];//son
  14. if(!size[y])//这里的意思其实就是如果这个儿子还没有访问过
  15. //因为我们可以看到每一次dfs的开始才会把size设一个数值 一开始应该都是0的
  16. //所以这里就可以直接当做一个vis标记用了
  17. {
  18. dep[y]=dep[x]+;//记录深度 son的深度 是father的深度+1
  19. fa[y]=x;//记录son的father 是谁
  20. Dfs(y);
  21. size[x]+=size[y];//更新x为根的子树的大小
  22. if(size[son[x]]<size[y])//son存储的是重儿子
  23. son[x]=y;//更新重儿子
  24. }
  25. }
  26. }
  27. void Dfs(int x,int tp)
  28. {
  29. top[x]=tp;//top数组是用来记录一条重链的顶端
  30. dfn[++cnt]=x;//dfn是记录第cnt个访问的点是x
  31. pos[x]=cnt;//pos记录第x个点是第cnt个访问的 当然在本题中不会用到
  32. if(son[x])//如果有重儿子 先走重儿子
  33. Dfs(son[x],tp);
  34. for(int i=;i<v[x].size();i++)
  35. {
  36. int y=v[x][i];
  37. if(!top[y])//走轻儿子
  38. Dfs(y,y);
  39. }
  40. }
  41. int lca(int x,int y)
  42. {
  43. while(top[x]!=top[y])//先跳到同一条重链上
  44. {
  45. if(dep[top[x]]<dep[top[y]])
  46. swap(x,y);
  47. x=fa[top[x]];
  48. }
  49. if(dep[x]>dep[y])//保证x的深度更小 x就是lca
  50. swap(x,y);
  51. return x;
  52. }
  53. inline int read()
  54. {
  55. int X=; bool flag=; char ch=getchar();
  56. while(ch<''||ch>'') {if(ch=='-') flag=; ch=getchar();}
  57. while(ch>=''&&ch<='') {X=(X<<)+(X<<)+ch-''; ch=getchar();}
  58. if(flag) return X;
  59. return ~(X-);
  60. }
  61. int main()
  62. {
  63. freopen("asm_virus.in","r",stdin);
  64. freopen("asm_virus.out","w",stdout);
  65. n=read(),Ques=read();
  66. for(int i=,x,y;i<n;i++)
  67. {
  68. x=read(),y=read();
  69. v[x].push_back(y);
  70. v[y].push_back(x);
  71. }
  72. Dfs();Dfs(,);
  73. for(int i=,x,y,u,v;i<=Ques;i++)
  74. {
  75. x=read(),y=read(),u=read(),v=read();
  76. int lca1=lca(x,y),lca2=lca(u,v);
  77. if(dep[lca1]<dep[lca2]) swap(lca1,lca2),swap(x,u),swap(y,v);
  78. if(lca(lca1,u)==lca1||lca(lca1,v)==lca1)
  79. puts("YES");
  80. else
  81. puts("NO");
  82. }
  83. return ;
  84. }

cogs 2098. [SYOI 2015] Asm.Def的病毒 LCA 求两条路径是否相交的更多相关文章

  1. LCA -cogs2098 [SYOI 2015] Asm.Def的病毒

    题目链接:http://cogs.pro:8081/cogs/problem/problem.php?pid=vQXmxVaPU [题目描述] “这就是我们最新研制的,世界上第一种可持久化动态计算机病 ...

  2. cogs——2098. Asm.Def的病毒

    2098. Asm.Def的病毒 ★☆   输入文件:asm_virus.in   输出文件:asm_virus.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] “这就 ...

  3. COGS 2098. Asm.Def的病毒

    ★☆   输入文件:asm_virus.in   输出文件:asm_virus.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] “这就是我们最新研制的,世界上第一种可持 ...

  4. COGS——C2098. Asm.Def的病毒

    http://www.cogs.pro/cogs/problem/problem.php?pid=2098 ★☆   输入文件:asm_virus.in   输出文件:asm_virus.out    ...

  5. COGS——T2084. Asm.Def的基本算法

    http://cogs.pro/cogs/problem/problem.php?pid=2084 ★☆   输入文件:asm_algo.in   输出文件:asm_algo.out   简单对比时间 ...

  6. COGS 2091. Asm.Def的打击序列

    ★★★   输入文件:asm_lis.in   输出文件:asm_lis.out   简单对比时间限制:4 s   内存限制:256 MB [题目描述] 白色圆柱形的“蓝翔”号在虚空中逐渐变大,一声沉 ...

  7. COGS 2084. Asm.Def的基本算法

    ★☆   输入文件:asm_algo.in   输出文件:asm_algo.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] “有句美国俗语说,如果走起来像鸭子,叫起来像 ...

  8. COGS 2082. Asm.Def谈笑风生

    ★   输入文件:asm_talk.in   输出文件:asm_talk.out   简单对比时间限制:2 s   内存限制:256 MB [题目描述] “人呐都不知道,自己不可以预料,直升机刚一出圣 ...

  9. cogs——2084. Asm.Def的基本算法

    2084. Asm.Def的基本算法 ★☆   输入文件:asm_algo.in   输出文件:asm_algo.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] “有句 ...

随机推荐

  1. Codeforces Round #189 (Div. 1 + Div. 2)

    A. Magic Numbers 不能出现连续的3个4,以及1.4以外的数字. B. Ping-Pong (Easy Version) 暴力. C. Malek Dance Club 考虑\(x\)二 ...

  2. HDU 1568

    - - 我自己开始以为是数值范围是1到100000000.... 搞了半天才发现是斐波那契数列的项数1到100000000 坑爹.!! 不会,只能看网上大牛的题解. 具体解释请看:http://www ...

  3. xml 校验

    package sax.parsing; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoun ...

  4. springmvc web.xml和application.xml配置详情(附:完整版pom.xml)

    web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="htt ...

  5. H3C 更新发送全部路由表浪费网络资源

  6. 扶桑号战列舰 (单调栈+线段树区间更新懒惰标记 or 栈)

    传送门 •题目描述 题目描述 众所周知,一战过后,在世界列强建造超无畏级战列舰的竞争之中,旧日本海军根据“个舰优越主义”,建造了扶桑级战列舰,完工时为当时世界上武装最为强大的舰只. 同时,扶桑号战列舰 ...

  7. 2019-5-21-NuGet-符号服务器

    title author date CreateTime categories NuGet 符号服务器 lindexi 2019-05-21 11:34:40 +0800 2019-05-08 21: ...

  8. dotnet 使用 MessagePack 序列化对象

    和很多序列化库一样,可以通过 MessagePack 序列化和反序列化,和 json 相比这个库提供了二进制的序列化,序列化之后的内容长度比 json 小很多 这个库能序列的内容不多,大多数时候建议使 ...

  9. 使用SuperWebSocket实现Web消息推送

    在大部分Web系统中,我们可能遇到需要向客户端推送消息的需求.SuperWebSocket第三方库能让我们轻松的完成任务.SuperWebSocket第三方库可以从网上下载,不过通过Visual St ...

  10. 25.python之面向对象

    一 三大编程范式 正本清源一:有人说,函数式编程就是用函数编程--->傻逼 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的python语法后,大家就可以写python代码了,然后每个 ...