L2-030 冰岛人 LCA 暴力
题解
首先说明一下题意,有些题面没说明白。如果A是C的第5代,B是C的第4代则不满足,要求最近公共祖先是两个人的5代及以上。
如果查询的是起源人也是输出NA。给出的名称最后表示性别的m和f不算为名称后缀,查询时会带有。
题目实际上就是给定一个图,问两个点是否有5代以内的最近公共祖先。由于给的是字符串,需要先用map编号为1~n的点处理。
映射编号建图后,从祖先节点0开始DFS求出每个点的深度。找LCA时深度深的先向上跳,只有当深度相同时k才减少。
由于只跳5次数据量不大直接暴力跳LCA就行。接受询问时,姓氏可以直接丢弃掉。
AC代码
#include <stdio.h>
#include <bits/stdc++.h>
#define fst first
#define sed second
using namespace std;
typedef long long ll;const int INF = 0x3f3f3f3f;
const ll LINF = 0x3f3f3f3f3f3f3f3f;
const int N = 1e5 + 10;
int f[N], s[N], d[N]; //父节点 性别 节点深度
char buf[100];
string a[N], b[N];
vector<int> e[N]; //父节点到儿子的边void DFS(int x, int dep) //求节点深度
{d[x] = dep;for (int y : e[x])DFS(y, dep + 1);
}
bool LCA(int x, int y, int k)
{if (!k || !x || !y) //最近的次数用尽或到达祖宗return 0;if (x == y)return 1;if (d[x] == d[y])return LCA(f[x], f[y], k - 1); //最近的一个至少5代if (d[x] > d[y]) //深的先跳return LCA(f[x], y, k);return LCA(x, f[y], k);
}
int main()
{#ifdef LOCALfreopen("C:/input.txt", "r", stdin);
#endiffor (int i = 1; i < N; ++i)f[i] = i; //自己是自己的父节点map<string, int> mp;int idx = 0;int n, m;cin >> n;for (int i = 0; i < n; ++i){scanf("%s", buf);a[i] = buf;scanf("%s", buf);b[i] = buf;mp[a[i]] = ++idx; //给自己标号s[idx] = b[i].back() == 'n' || b[i].back() == 'm';if (b[i].back() == 'r') //消除名称后缀 不消除mfb[i].resize(b[i].size() - 7);else if (b[i].back() == 'n')b[i].resize(b[i].size() - 4);}for (int i = 0; i < n; ++i){int x = mp[a[i]], y = mp[b[i]];f[x] = y, e[y].push_back(x); //建立关系 祖宗节点为0}DFS(0, 0);cin >> m;for (int i = 0; i < m; ++i){string x, y;scanf("%s", buf);x = buf;scanf("%s", buf); //丢弃姓氏scanf("%s", buf);y = buf;scanf("%s", buf);int a = mp[x], b = mp[y];if (!a || !b) //祖宗也算NAprintf("NA\n");else if (s[a] == s[b])printf("Whatever\n");elseprintf("%s\n", LCA(a, b, 4) ? "No" : "Yes");}return 0;
}
L2-030 冰岛人 LCA 暴力相关推荐
- 天梯赛 L2-030 冰岛人(LCA,树上倍增)
链接 题面描述: 2018年世界杯,冰岛队因1:1平了强大的阿根廷队而一战成名.好事者发现冰岛人的名字后面似乎都有个"松"(son),于是有网友科普如下: 冰岛人沿用的是维京人古老 ...
- 【L2-030 冰岛人】天梯赛L2系列详解
天梯赛L2-030 冰岛人 题目详情: 思路: 先搞清楚题目要求我们干什么? 直接看输出格式部分,四种情况:异性,同性,有无共同祖先,是否在名单内. 1.判断性别:如果是维京人那么通过性别后缀,否则通 ...
- L2-030 冰岛人
2018年世界杯,冰岛队因1:1平了强大的阿根廷队而一战成名.好事者发现冰岛人的名字后面似乎都有个"松"(son),于是有网友科普如下: 冰岛人沿用的是维京人古老的父系姓制,孩子的 ...
- L2-030 冰岛人 (25分)
L2-030 冰岛人 (25分) 2018年世界杯,冰岛队因1:1平了强大的阿根廷队而一战成名.好事者发现冰岛人的名字后面似乎都有个"松"(son),于是有网友科普如下: 冰岛人沿 ...
- L2-030 冰岛人 (25 分) unordered_map
L2-030 冰岛人 题目 代码 题目 L2-030 冰岛人 (25 分) 冰岛人沿用的是维京人古老的父系姓制,孩子的姓等于父亲的名加后缀,如果是儿子就加 sson,女儿则加 sdottir.因为冰岛 ...
- L2-030 冰岛人 (25 分)-PAT 团体程序设计天梯赛 GPLT
2018年世界杯,冰岛队因1:1平了强大的阿根廷队而一战成名.好事者发现冰岛人的名字后面似乎都有个"松"(son),于是有网友科普如下: 冰岛人沿用的是维京人古老的父系姓制,孩子的 ...
- 【CCCC】L2-030 冰岛人 (25分) 模拟题,二叉树链式存储,从底部向上
problem L2-030 冰岛人 (25分) 2018年世界杯,冰岛队因1:1平了强大的阿根廷队而一战成名.好事者发现冰岛人的名字后面似乎都有个"松"(son),于是有网友科普 ...
- L2-030 冰岛人 (25 分)
L2-030 冰岛人 (25 分) 2018年世界杯,冰岛队因1:1平了强大的阿根廷队而一战成名.好事者发现冰岛人的名字后面似乎都有个"松"(son),于是有网友科普如下: 冰岛人 ...
- L2-030 冰岛人 (25分)
2018年世界杯,冰岛队因1:1平了强大的阿根廷队而一战成名.好事者发现冰岛人的名字后面似乎都有个"松"(son),于是有网友科普如下: 冰岛人沿用的是维京人古老的父系姓制,孩子的 ...
最新文章
- seaborn系列 (5) | 柱状图countplot()
- 【开发环境】安装 Visual Studio Ultimate 2013 开发环境 ( 下载软件 | 安装软件 | 运行软件 )
- docker基础---数据卷volumes
- Angular input decorator学习笔记
- Java工作笔记-使用jquery.timer.js实现数据自动刷新
- macOS安装Telnet
- 从Chrome源码看DNS解析过程
- 【2023年战略管理公开课计划】向华为学习 业务领先的战略规划SP(BLM)和战略解码BP(BEM)
- doc 问卷调查模板表_问卷调查表格式范本.doc
- java设计模式5,接口隔离原则
- 满腔热诚永不忘,我以我血荐轩辕!
- 打印预览的线条粗细问题
- 洛谷P4572 [JSOI2013] 哈利波特与死亡圣器
- iis,w3wp一直出现WerFault.exe应用程序错误
- eslint plugins与extends的区别
- 哈工大计算机系统大作业——hello P2P
- webService公共开放接口大全
- APP开发流程注意事项有哪些
- js、jq实现答题上一题下一题
- 中国石油大学《大学英语(三)统考》第一套模拟题
热门文章
- HandlerThread详解
- Linux系统上安装JDK(有图详解)
- QQ被限制登录的解决方法
- 苹果手机删除的照片怎么恢复?3种有效方法推荐
- 德州中考计算机考试试题,德州信息技术中考备考样题4综合
- mac php服务器安装mysql数据库文件下载_Linux_centos安装mysql数据库的方法,1、首先下载MySQL的安装文件, - phpStudy...
- JS 控制浏览器全屏和取消全屏
- 论文笔记:Dual-Level Collaborative Transformer for Image Captioning
- 我的世界服务器伤害显示mod,我的世界伤害与血量显示mod
- 3D建模师主要在公司做哪些工作?