cogs——2098. Asm.Def的病毒

2098. Asm.Def的病毒

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

【题目描述】

 

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

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

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

“为何不假装呢?”Asm.Def说。blog

“固然不行,它比咱们更懂假装。”内存

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

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

Asm.Def想把病毒假装成杀毒软件,入侵透明计算网络。透明计算网络的文件结构是一棵N个节点的树,每一个病毒能够入侵一条路径上的全部节点。但若是两个病毒入侵了同一个节点,因为它们假装成了杀毒软件,就会自相残杀。Asm.Def不但愿这样的状况发生,因此他须要仔细制定入侵计划。为此,他须要频繁地询问,两条路径是否通过同一个节点(便是否相交)。it

【输入格式】

 

第一行两个整数N,Q。io

 

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

 

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

 

 

【输出格式】

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

【样例输入】

6 5
1 2
1 3
2 4
4 5
4 6
1 1 5 6
1 2 6 3
2 3 5 6
6 4 3 1
4 3 1 2

【样例输出】

NO
YES
NO
NO
YES

【提示】

 

N,Q<=1000.

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

 

水题:在树上的两条路径通过同一个点的条件是这两条路径有共同的lca,这样说也不是很准确。

咱们来这样看

咱们看2 ,7与4 ,5显然他们两个的路径上相交的,咱们来看,2 7的lca为4 、4 5的lca为1.这两值并不相同啊,可是咱们能够发现,若是这两条路径相交那么这两组lca中上深度深的那个lca必定与另外一组数其中一个值的lca必定为那个深度深的lca。不信?!咱们来看这个图,二、7的lca为4,4 、5的lca为1,这样深度深的lca为4,他与5的lca刚好是1,而且这两组路径相交。

代码:

#include<cstdio>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 1100
using namespace std;
vector<int>vec[N];
int n,m,x,y,q,p,root;
int fa[N],top[N],deep[N],size[N];
int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}
    return x*f;
}
int lca(int x,int y)
{
    for(;top[x]!=top[y];)
    {
        if(deep[top[x]]<deep[top[y]])
         swap(x,y);
        x=fa[x];
    }
    if(deep[x]>deep[y])
     swap(x,y);
    return x;
}
int dfs(int x)
{
    size[x]=1;
    deep[x]=deep[fa[x]]+1;
    for(int i=0;i<vec[x].size();i++)
     if(vec[x][i]!=fa[x])
     {
         fa[vec[x][i]]=x;
         dfs(vec[x][i]);
         size[x]+=size[vec[x][i]];
     }
}
int dfs1(int x)
{
    int t=0;
    if(!top[x]) top[x]=x;
    for(int i=0;i<vec[x].size();i++)
     if(vec[x][i]!=fa[x]&&size[vec[x][i]]>size[t])
      t=vec[x][i];
    if(t) top[t]=top[x],dfs1(t);
    for(int i=0;i<vec[x].size();i++)
      if(vec[x][i]!=fa[x]&&vec[x][i]!=t)
       dfs1(vec[x][i]);
}
int main()
{
    freopen("asm_virus.in","r",stdin);
    freopen("asm_virus.out","w",stdout);
    n=read(),m=read();
    for(int i=1;i<n;i++)
    {
        x=read(),y=read();fa[y]=x;
        vec[x].push_back(y);
        vec[y].push_back(x);
    }
    dfs(1),dfs1(1);
    for(int i=1;i<=m;i++)
    {
        x=read(),y=read(),q=read(),p=read();
        int Lca=lca(x,y),LCA=lca(q,p);
        //printf("%d %d\n",Lca,LCA);
        if(deep[Lca]<deep[LCA])
         swap(Lca,LCA),swap(x,q),swap(y,p);
        if(lca(Lca,q)==Lca||lca(Lca,p)==Lca) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}
相关文章
相关标签/搜索