题解

首先说明一下题意,有些题面没说明白。如果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 暴力相关推荐

  1. 天梯赛 L2-030 冰岛人(LCA,树上倍增)

    链接 题面描述: 2018年世界杯,冰岛队因1:1平了强大的阿根廷队而一战成名.好事者发现冰岛人的名字后面似乎都有个"松"(son),于是有网友科普如下: 冰岛人沿用的是维京人古老 ...

  2. 【L2-030 冰岛人】天梯赛L2系列详解

    天梯赛L2-030 冰岛人 题目详情: 思路: 先搞清楚题目要求我们干什么? 直接看输出格式部分,四种情况:异性,同性,有无共同祖先,是否在名单内. 1.判断性别:如果是维京人那么通过性别后缀,否则通 ...

  3. L2-030 冰岛人

    2018年世界杯,冰岛队因1:1平了强大的阿根廷队而一战成名.好事者发现冰岛人的名字后面似乎都有个"松"(son),于是有网友科普如下: 冰岛人沿用的是维京人古老的父系姓制,孩子的 ...

  4. L2-030 冰岛人 (25分)

    L2-030 冰岛人 (25分) 2018年世界杯,冰岛队因1:1平了强大的阿根廷队而一战成名.好事者发现冰岛人的名字后面似乎都有个"松"(son),于是有网友科普如下: 冰岛人沿 ...

  5. L2-030 冰岛人 (25 分) unordered_map

    L2-030 冰岛人 题目 代码 题目 L2-030 冰岛人 (25 分) 冰岛人沿用的是维京人古老的父系姓制,孩子的姓等于父亲的名加后缀,如果是儿子就加 sson,女儿则加 sdottir.因为冰岛 ...

  6. L2-030 冰岛人 (25 分)-PAT 团体程序设计天梯赛 GPLT

    2018年世界杯,冰岛队因1:1平了强大的阿根廷队而一战成名.好事者发现冰岛人的名字后面似乎都有个"松"(son),于是有网友科普如下: 冰岛人沿用的是维京人古老的父系姓制,孩子的 ...

  7. 【CCCC】L2-030 冰岛人 (25分) 模拟题,二叉树链式存储,从底部向上

    problem L2-030 冰岛人 (25分) 2018年世界杯,冰岛队因1:1平了强大的阿根廷队而一战成名.好事者发现冰岛人的名字后面似乎都有个"松"(son),于是有网友科普 ...

  8. L2-030 冰岛人 (25 分)

    L2-030 冰岛人 (25 分) 2018年世界杯,冰岛队因1:1平了强大的阿根廷队而一战成名.好事者发现冰岛人的名字后面似乎都有个"松"(son),于是有网友科普如下: 冰岛人 ...

  9. L2-030 冰岛人 (25分)

    2018年世界杯,冰岛队因1:1平了强大的阿根廷队而一战成名.好事者发现冰岛人的名字后面似乎都有个"松"(son),于是有网友科普如下: 冰岛人沿用的是维京人古老的父系姓制,孩子的 ...

最新文章

  1. seaborn系列 (5) | 柱状图countplot()
  2. 【开发环境】安装 Visual Studio Ultimate 2013 开发环境 ( 下载软件 | 安装软件 | 运行软件 )
  3. docker基础---数据卷volumes
  4. Angular input decorator学习笔记
  5. Java工作笔记-使用jquery.timer.js实现数据自动刷新
  6. macOS安装Telnet
  7. 从Chrome源码看DNS解析过程
  8. 【2023年战略管理公开课计划】向华为学习 业务领先的战略规划SP(BLM)和战略解码BP(BEM)
  9. doc 问卷调查模板表_问卷调查表格式范本.doc
  10. java设计模式5,接口隔离原则
  11. 满腔热诚永不忘,我以我血荐轩辕!
  12. 打印预览的线条粗细问题
  13. 洛谷P4572 [JSOI2013] 哈利波特与死亡圣器
  14. iis,w3wp一直出现WerFault.exe应用程序错误
  15. eslint plugins与extends的区别
  16. 哈工大计算机系统大作业——hello P2P
  17. webService公共开放接口大全
  18. APP开发流程注意事项有哪些
  19. js、jq实现答题上一题下一题
  20. 中国石油大学《大学英语(三)统考》第一套模拟题

热门文章

  1. HandlerThread详解
  2. Linux系统上安装JDK(有图详解)
  3. QQ被限制登录的解决方法
  4. 苹果手机删除的照片怎么恢复?3种有效方法推荐
  5. 德州中考计算机考试试题,德州信息技术中考备考样题4综合
  6. mac php服务器安装mysql数据库文件下载_Linux_centos安装mysql数据库的方法,1、首先下载MySQL的安装文件, - phpStudy...
  7. JS 控制浏览器全屏和取消全屏
  8. 论文笔记:Dual-Level Collaborative Transformer for Image Captioning
  9. 我的世界服务器伤害显示mod,我的世界伤害与血量显示mod
  10. 3D建模师主要在公司做哪些工作?