当前位置: 首页 > news >正文

即墨区建设局网站外国网站怎么进入

即墨区建设局网站,外国网站怎么进入,网站建设管理ppt模板,做ui的网站有哪些这是LCA的一个应用,关于LCA P3398 仓鼠找 sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar 住在地下洞穴中,每个节点的编号为 1 ∼ n 1\sim n 1∼n。地下洞穴是一个树形结构。这一天小仓鼠打算从从他…

这是LCA的一个应用,关于LCA

P3398 仓鼠找 sugar

题目描述

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

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

输入格式

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

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

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

输出格式

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

输入输出样例 #1

输入 #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 % 20\% 20% 的数据 n , q ≤ 200 n, q\le200 n,q200

40 % 40\% 40% 的数据 n , q ≤ 2 × 1 0 3 n, q\le 2\times10^3 n,q2×103

70 % 70\% 70% 的数据 n , q ≤ 5 × 1 0 4 n, q\le 5\times10^4 n,q5×104

100 % 100\% 100% 的数据 1 ≤ n , q ≤ 1 0 5 1\le n, q\le10^5 1n,q105

解析

我说白了,我白说了
题意就是求a->b的路径与c->d的路径是否有交叉
这道题就是LCA的应用。怎么应用?诸君请看图(图中出现字母含义与题干相同):

  • 当路径有交点时:
    在这里插入图片描述
    不难发现,路径交点就是LCA(b,c),如果这个点的深度大于LCA(a,b)和LCA(c,d)的话,这个LCA(b,c)点就是交点
  • 当路径没有交点时,我们知道此时的两条路径就是两棵没有交叉点的数,此时若求LCA(b,c)的话得到的就是LCA(LCA(a,b),LCA(c,d))了,这个点的深度显然会比LCA(a,b)和LCA(c,d)小。

于是我们可以通过比较LCA(a,b)、LCA(c,d)、LCA(b,c)的深度来得到答案

当然,谁也确定不了是LCA(a,b)->b与LCA(c,d)->c的路叉了,还是LCA(a,b)->b与LCA(c,d)->d的路叉了,还是LCA(a,b)->a与LCA(c,d)->d的路叉了,还是LCA(a,b)->a与LCA(c,d)->c的路叉了,所以得稍加枚举哦!

代码

#include<bits/stdc++.h>
using namespace std;
const int MAXN=200005;
int n,q;
int deep[MAXN];
vector<pair<int,int> >g[MAXN];
struct EDGE{int to,nxt;
}edge[MAXN];
int head[MAXN];
int ans[MAXN*3];
int id;
int tot;
int vis[MAXN];
int fa[MAXN];
void add(int u,int v){tot++;edge[tot].nxt=head[u];edge[tot].to=v;head[u]=tot;
}
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);
}
void ask(int x,int y){id++;g[x].push_back(make_pair(y,id));g[y].push_back(make_pair(x,id));
}
//Tarjan求LCA
void tarjan(int u,int f,int d){vis[u]=1;deep[u]=d;for(int i=head[u];i;i=edge[i].nxt){int v=edge[i].to;if(v==f) continue;tarjan(v,u,d+1);fa[v]=u;}vis[u]=2;for(int i=0;i<g[u].size();i++){if(vis[g[u][i].first]==2) ans[g[u][i].second]=deep[find(g[u][i].first)];}
}
int main(){cin>>n>>q;int ui,vi,a,b,c,d;for(int i=1;i<n;i++){cin>>ui>>vi;add(ui,vi);add(vi,ui);}for(int i=1;i<=n;i++){fa[i]=i;}for(int i=1;i<=q;i++){cin>>a>>b>>c>>d;ask(a,b);ask(c,d);ask(a,d);ask(a,c);ask(b,c);ask(b,d);//枚举四种可能相交的情况//由于采用了Tarjan求法,所以在预处理查询时有点麻烦}tarjan(1,0,1);for(int i=1;i<=q*6;i+=6){int x1=ans[i];//LCA(a,b)int x2=ans[i+1];//LCA(c,d)int x3=max(max(ans[i+2],ans[i+3]),max(ans[i+4],ans[i+5]));//看看是四种交叉情况中的哪一种。当有交点,最深的就是交点。若没有,即使是最深的也有x1>x3或x2>x3if(x1<=x3&&x2<=x3) cout<<"Y"<<endl;else cout<<"N"<<endl;}return 0;
}

码字不易,能给个赞吗O_o?

http://www.dtcms.com/a/531188.html

相关文章:

  • 企业网站备案注销太原做网站设计
  • 广州华优_网站建设公司0基础学网站开发
  • 中英文网站如何做思路如何建设淘宝客网站
  • 温州多语言网站建设仿站网站
  • 网站后台怎么上传图片产品店面设计费一般多少钱一平
  • 手机网站拒绝访问怎么解决东莞制作公司网站的公司
  • 淄博网站推广网站域名分类
  • 怎么自己创立网站移动健康app下载
  • 上海怎样建设网站seo顾问合同
  • 商城网站建设用乐云seo系统山东省服务外包网
  • html5门户网站模板云建站模板
  • 上海制作企业网站网站建设和推广话术6
  • cnzz网站代做网站建设课程中的收获
  • 怎样注册网站帐号申请哪个网站可以做破案h5
  • 仿门户网站多功能js相册画廊源码 支持缩略小图浏览网站怎么加留言
  • 阿里云官方网站WordPress 文章 iframe
  • 网站建设基础问题idc机房托管费用
  • 好看的手机网站布局企业网站的在线推广方法有哪几种
  • 如何建立外贸网站wordpress模版对主机要求
  • 网站建设费 摊销处理自己设计装修手机软件
  • 镇江地区做网站的公司有哪些花生壳怎么建设网站
  • jsp做的网站简约个人网站模板
  • 南阳企业网站建设公司wordpress ssl 500
  • 法拍重庆网站深圳影视广告公司
  • 成都网站建设 工资网络维护人员
  • 做暧暧暖网站专题网站建设解决方案
  • 做防伪的网站网站开发有几种
  • 体育西网站开发定制wordpress远程发布
  • 四川省城乡住房和城乡建设厅网站网站免费申请建站
  • 建设网站计划ppt模板南通建设局网站查询