zoukankan      html  css  js  c++  java
  • 洛谷P3398 仓鼠找sugar

    题目描述

    小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n。地下洞穴是一个树形结构。这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c)到图书馆(d)。他们都会走最短路径。现在小仓鼠希望知道,有没有可能在某个地方,可以碰到他的基友?

    小仓鼠那么弱,还要天天被zzq大爷虐,请你快来救救他吧!

    输入输出格式

    输入格式:

    第一行两个正整数n和q,表示这棵树节点的个数和询问的个数。

    接下来n-1行,每行两个正整数u和v,表示节点u到节点v之间有一条边。

    接下来q行,每行四个正整数a、b、c和d,表示节点编号,也就是一次询问,其意义如上。

    输出格式:

    对于每个询问,如果有公共点,输出大写字母“Y”;否则输出“N”。

    输入输出样例

    输入样例#1:
    5 5
    2 5
    4 2
    1 3
    1 4
    5 1 5 1
    2 2 1 4
    4 1 3 4
    3 1 1 5
    3 5 1 4
    输出样例#1:
    Y
    N
    Y
    Y
    Y

    说明

    本题时限1s,内存限制128M,因新评测机速度较为接近NOIP评测机速度,请注意常数问题带来的影响。

    20%的数据 n<=200,q<=200

    40%的数据 n<=2000,q<=2000

    70%的数据 n<=50000,q<=50000

    100%的数据 n<=100000,q<=100000

    求四遍LCA,根据大小关系判定是否可能遇到。

     1 /*by SilverN*/
     2 #include<algorithm>
     3 #include<iostream>
     4 #include<cstring>
     5 #include<cstdio>
     6 #include<cmath>
     7 #include<vector>
     8 using namespace std;
     9 const int mxn=100010;
    10 int read(){
    11     int x=0,f=1;char ch=getchar();
    12     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    13     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
    14     return x*f;
    15 }
    16 struct edge{
    17     int v,nxt;
    18 }e[mxn<<1];
    19 int hd[mxn],mct=0;
    20 void add_edge(int u,int v){
    21     e[++mct].v=v;e[mct].nxt=hd[u];hd[u]=mct;return;
    22 }
    23 int n,q;
    24 int fa[mxn][17];
    25 int dep[mxn];
    26 void DFS(int u,int f){
    27     dep[u]=dep[f]+1;
    28     for(int i=1;i<17;i++)
    29         fa[u][i]=fa[fa[u][i-1]][i-1];
    30     for(int i=hd[u];i;i=e[i].nxt){
    31         int v=e[i].v;
    32         if(v==f)continue;
    33         fa[v][0]=u;
    34         DFS(v,u);
    35     }
    36     return;
    37 }
    38 int LCA(int x,int y){
    39     if(dep[x]<dep[y])swap(x,y);
    40     for(int i=16;i>=0;i--)
    41         if(dep[fa[x][i]]>=dep[y])x=fa[x][i];
    42     if(x==y)return x;
    43     for(int i=16;i>=0;i--)
    44         if(fa[x][i]!=fa[y][i]){
    45             x=fa[x][i];y=fa[y][i];
    46         }
    47     return fa[x][0];
    48 }
    49 int main(){
    50     int i,j,u,v;
    51     n=read();q=read();
    52     for(i=1;i<n;i++){
    53         u=read();v=read();
    54         add_edge(u,v);
    55         add_edge(v,u);
    56     }
    57     int x,y;
    58     DFS(1,0);
    59     for(i=1;i<=q;i++){
    60         u=read();v=read();x=read();y=read();
    61         int tmp=max(dep[LCA(u,v)],dep[LCA(x,y)]);
    62         int res=max(max(dep[LCA(u,x)],dep[LCA(u,y)]),
    63                     max(dep[LCA(v,x)],dep[LCA(v,y)]));
    64         if(res>=tmp)printf("Y
    ");
    65         else printf("N
    ");
    66     }
    67     return 0;
    68 }
  • 相关阅读:
    Docker 安装NGINX
    Ant 使用setFieldsValue更新Form表单值
    SpringSecurity设置角色和权限
    java 获取昨天、今天、明天的时间
    Ubuntu 20.04 root ssh登录配置
    http: server gave HTTP response to HTTPS client解决方案:
    06-多线程笔记-2-锁-3-Lock
    05-多线程笔记-2-锁-2-Synchronized
    04-多线程笔记-2-锁-1-死锁
    volatile
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/6127942.html
Copyright © 2011-2022 走看看