hiho刷题日记——第十五最近公共祖先·二

国央企创新负责人如何通过平台实现科研成果的快速识别与转化?.docx 科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。 立即下载

题目

与最近公共祖先·一
将设置关系数量和查询关系数量的数量级都从100提升到100000。

思路

用邻接表,将家族关系建树,查询情况建图。
使用离线算法的方式,通过一次深度优先遍历家族树,得出所有查询的答案。
遍历时,第一次访问结点,将该节点做个标记1。访问完结点的所有子结点时,标记为2。
在遍历到一个节点时,在查询图中扫描所有该节点的边,检查边的另一个端点的标记。若标记为0,无视;若标记为1,则说明该节点是另一个端点在家族树中的子节点,最近公共祖先便为另一个端点;若标记为2,则说明,从另一端点追查到的第一个标记为1的祖先,是他们的最近公共祖先。

优化

加上并查集。

代码
#include<cstdio> 
#include<iostream>
#include<string>
#include<cstring>
#include<map>

using namespace std;
const int MAX_SIZE=100000+5;
int N;
int fa[MAX_SIZE],color[MAX_SIZE];
int head_q[MAX_SIZE],head_t[MAX_SIZE],e_q=0,e_t=0;
int ans[MAX_SIZE<<1];
map<string,int> s_id;
map<int,string> id_s;

struct EDGE
{
    int v,next;
}edge_q[MAX_SIZE<<1],edge_t[MAX_SIZE];

void addEdge_t(int x,int y)
{
    edge_t[e_t].v=y;
    edge_t[e_t].next=head_t[x];
    head_t[x]=e_t++;
}

void addEdge_q(int x,int y)
{
    edge_q[e_q].v=y;
    edge_q[e_q].next=head_q[x];
    head_q[x]=e_q++;
}

int find_fa(int x)
{
    if(x!=-1 && color[x]==2) return fa[x]=find_fa(fa[x]);
    return x;
}

void dfs(int cur)
{
    color[cur]++;
    int p=head_q[cur];
    while(p!=-1)
    {
        if(color[edge_q[p].v] == 1) 
        {
            ans[p]=edge_q[p].v;
            if(p%2) ans[p-1]=ans[p];
            else ans[p+1]=ans[p];
        }
        if(color[edge_q[p].v] == 2) 
        {
            ans[p]=find_fa(edge_q[p].v);
            if(p%2) ans[p-1]=ans[p];
            else ans[p+1]=ans[p];
        }
        p=edge_q[p].next;
    }
    p=head_t[cur];
    while(p!=-1)
    {
        dfs(edge_t[p].v);
        p=edge_t[p].next;
    }
    color[cur]++;
}

int main()
{
    memset(head_q,-1,sizeof(head_q));
    memset(head_t,-1,sizeof(head_t));
    memset(fa,-1,sizeof(fa));
    memset(color,0,sizeof(color));
    int id=0;
    string fn,sn;
    scanf("%d",&N);
    while(N--)
    {
        cin>>fn>>sn;
        if(!s_id.count(fn)) 
        {
            s_id[fn]=id;
            id_s[id]=fn;
            id++;
        }
        if(!s_id.count(sn))
        {
            s_id[sn]=id;
            id_s[id]=sn;
            id++;
        }
        addEdge_t(s_id[fn],s_id[sn]);
        fa[s_id[sn]]=s_id[fn];
    } 

    scanf("%d",&N);
    while(N--)
    {
        cin>>fn>>sn;
        addEdge_q(s_id[fn],s_id[sn]);
        addEdge_q(s_id[sn],s_id[fn]);
    }

    dfs(0);
    for(int i=0;i<e_q;i+=2)
    {
        cout<<id_s[ans[i]]<<endl;
    }

    return 0;
}
PotPlayer自用皮肤 自用 PotPlayer 皮肤,仅微调了字体大小与颜色,是按个人习惯调整,未做适配性调整。 立即下载

相关推荐

解决西门子Step 7 basic 找不到许可证问题

你在使用博图软件是否遇到过Step 7 basic 找不到许可证的问题呢!不言怕,今天我就来告诉你该如何处理吧!看步骤: 1.删除原授权的License: 打开Automation License Manager应用,然后我们可以发现仅有的License Key前面有一个时钟,说明它已经过期不可用,我们就要去寻求新的Key. 打开“我的电脑”,选择C盘,点击上方查看 点击选项–>查看 然...

让技术没有门槛 14万+

HIHO #1062 : 最近公共祖先·一

题目链接题目数据小直接暴力计算小坑点:a==b 的时候输出a就好了 #include<cstdio> #include<algorithm> #include<iostream> #include<cstring> #include<string> #include<cmath> #include<queue> #include<map> #include<set> #include<cstdlib

qwesde 503

从零构建eSIM RSP服务:云原生架构与GSMA合规实践

本文详细阐述了从零开始构建一个符合GSMA SAS-SM安全标准的云原生eSIM RSP服务的完整路径。内容涵盖云原生基础设施选型、容器化部署、GSMA标准接口集成,并重点分享了通过SAS-SM安全审计的实战经验与避坑指南,为物联网及智能设备企业自建可控的远程SIM配置服务提供了系统性的解决方案。

weixin_29322553的博客 458

[ACM] hihocoder 1062 最近公共祖先·一 (一般做法)

描述 小Ho最近发现了一个神奇的网站!虽然还不够像58同城那样神奇,但这个网站仍然让小Ho乐在其中,但这是为什么呢? “为什么呢?”小Hi如是问道,在他的观察中小Ho已经沉迷这个网站一周之久了,甚至连他心爱的树玩具都弃置一边。 “嘿嘿,小Hi,你快过来看!”小Ho招呼道。 “你看,在这个对话框里输入我的名字,在另一个对话框里,输入你的名字,再点这个查询按钮,就可以查出来……什么!我们居然有

逆风的方向 更适合飞翔 2519

Zipformer实战:5分钟快速搭建语音识别模型(附LibriSpeech测试结果)

本文提供了一份详细的Zipformer语音识别模型实战指南。通过清晰的步骤,指导读者在5分钟内完成从环境配置、LibriSpeech数据集准备到模型训练与测试的全过程。文章重点解析了关键配置参数,并分享了在LibriSpeech测试集上的性能结果,帮助开发者快速评估和应用这一高效的语音识别架构。

weixin_35578748的博客 161

Android 13高通平台CTS camera部分fail项修改(续)

接着上一篇,有几个提了case高通也分析了很久的fail项,其中最离谱的是问题1,第一个接手case的人反反复复处理、内部排查踢皮球、要求log,折腾了很久,最终就给出个解不了的结论。后面还是靠着自己发现了一些蛛丝马迹,并且换了个case接手人才最终解决。

hkj887tg的博客 2060

hiho刷题日记——第十七天最近公共祖先·三

问题还是最近公共祖先问题。思路之前用了Tarjan算法来做。但是这里遇到一个问题就是如果只有一个询问,那么将很难决定到底是针对这个询问就直接进行计算还是等待一定数量的询问一起计算。毕竟无论是一个询问还是很多个询问,使用离线算法都是只需要做一次深度优先搜索就可以了的。 所以这一次改用一个在线算法。 先根据输入建立一棵家族树。 建立好家族树之后,深度遍历该树。使用一个数组来记录走过的路径(无论是从

AngcFun的博客 601

手把手教你用Xilinx SelectIO IP核搞定ADS42LB69高速ADC的DDR数据采集(附仿真调试技巧)

本文详细介绍了如何使用Xilinx SelectIO IP核实现ADS42LB69高速ADC的DDR数据采集,包括IP核配置、仿真验证和硬件调试技巧。通过精准的时序控制和实战调试方法,解决高速数据采集中的时序对齐问题,提升系统稳定性和可靠性。特别适合FPGA工程师和高速ADC接口设计者参考。

weixin_42533622的博客 152

hiho刷题日记——第十三天最近公共祖先·一

题目已知一棵族谱树。查找两个人的最近公共祖先。输入每个测试点(输入文件)有且仅有一组测试数据。 每组测试数据的第1行为一个整数N,意义如前文所述。 每组测试数据的第2~N+1行,每行分别描述一对父子关系,其中第i+1行为两个由大小写字母组成的字符串Father_i, Son_i,分别表示父亲的名字和儿子的名字。 每组测试数据的第N+2行为一个整数M,表示小Hi总共询问的次数。 每组测试数据的

AngcFun的博客 722

swl安装无法与服务器建立链接,如何解决?

🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!! 备注:部分问题/疑难杂症搜集于互联网。

**My Coding Family** 2075

PID控制算法实践应用(一):PID算法的离散化

由于计算机控制是一种采样控制,它只能根据采样时刻的偏差值计算控制量。因此,连续PID控制算法不能直接使用,需要采用离散化方法。

m0_72676510的博客 2602

hiho刷题日记——第三十一天小Hi小Ho的惊天大作战:扫雷·二

题目这次的扫雷是二维的了。根据三种规则做一次判断,判断出一定是雷和一定不是雷的数量。 1.如果某一个被探明的格子里所标的数字为0,那么它相邻的8个格子里的未探明格子被认作是一定不是地雷的格子。 2.如果某一个被探明的格子里所标的数字为K,且它相邻的8个格子里正好有K个没有探明的格子的话,则这K个没有探明的格子被认作是一定是地雷的格子。 3.如果某两个探明了的格子A和B,他们中标明的数字分别为P

AngcFun的博客 1530

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

hiho刷题日记——第三十天小Hi小Ho的惊天大作战:扫雷·一

题目简化版扫雷,只有一行。 给出一行的周围3格中是雷的数量。 判断哪些一定是雷,一定不是雷。 思路因为给出的信息是环环相扣的,不用一个一个去试。 只需要试第一格是否为雷就可以通过数据算出后面是否为雷。 所以只用试两次, 第一次把一格设为雷,算出后面的情况;第二次把第一格设为不是雷,算出后面的情况。 若两次都算出来了,则将两次的情况对比,没有变化的部分就是答案。 若只有一次满足条件,则

AngcFun的博客 1234

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

hiho刷题日记——第十二天刷油漆

题目一共N个结点的树(1至N编号),油漆能够涂M个结点。 将包含1号结点的一部分连通的结点进行涂漆(这里的连通指的是这一些涂漆的结点可以互相到达并且不会经过没有涂漆的结点),然后将剩下的结点拆掉!那么究竟选择哪些结点进行涂漆呢?小Ho想了想给每个结点都评上了分——他希望最后留下来,也就是涂漆了的那些结点的评分之和可以尽可能的高!输入每个测试点(输入文件)有且仅有一组测试数据。 每组测试数据的第一

AngcFun的博客 1014

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

hiho刷题日记——第九天状态压缩·二

hiho刷题日记——第九天天状态压缩·二题目小Hi和小Ho领到了一个大小为N*M的长方形盘子,他们可以用这个盒子来装一些大小为2*1的蛋糕。但是根据要求,他们一定要将这个盘子装的满满的,一点缝隙也不能留下来,才能够将这些蛋糕带走。这么简单的问题自然难不倒小Hi和小Ho,于是他们很快的就拿着蛋糕离开了~但小Ho却不只满足于此,于是他提出了一个问题——他们有多少种方案来装满这个N*M的盘子呢?代码#in

AngcFun的博客 971

hiho刷题日记——第十六天RMQ-ST算法

这两天有事停了两天。这道题也是调了不少时间。好累呀。真想就直接贴代码。ST定义ST[Len][L]表示左边界为L,长度为2^Len的区间中的最小值。则有 ST[Len][L]=min(ST[Len-1][L],ST[Len-1][L+2^(Len-1)]; 然后就可以循环求出所有的ST。答案取小于这个区间长度的最大的2的非负整数次幂T,则答案为min(ST[Len][L],ST[Len][R+1

AngcFun的博客 888

hiho刷题日记——第十一天树中的最长路

题目给出一个无根树(其实就可以之间看作一个特殊的无向图) 求出该无根树的最长路 样例输入 8 1 2 1 3 1 4 4 5 3 6 6 7 7 8 样例输出 6思路对于任意一个节点,将其视为根节点,找到深度最深的节点记录下来。 再将找到的节点作为根节点找出深度最深的节点,两点之间的路便是这无根树的最长路。原因假设我们已知了最长路的两个端点。那么将这颗无根树上的任意一个节点

AngcFun的博客 868

hiho刷题日记——第六天01背包

简单的01背包问题,简单的说就是将已有的资源发挥出最大的价值。

AngcFun的博客 743

hiho刷题日记——第三天KMP算法

用KMP来求模式串在原串中的出现次数.

AngcFun的博客 702

hiho刷题日记——第八天状态压缩·一

当状态转移方程中状态过多时,进行压缩

AngcFun的博客 701

hiho刷题日记——第二天Trie树

建立Trie树来统计以某字符串为前缀的单词在字典中的个数。

AngcFun的博客 693

hiho刷题日记——第十四天无间道之并查集

题目有两种操作。 0是 设置两人同阵营 1是 查询两人是否同阵营输入每个测试点(输入文件)有且仅有一组测试数据。 每组测试数据的第1行为一个整数N,表示总共进行的操作次数。 每组测试数据的第2~N+1行,每行分别描述一次操作,其中第i+1行为一个整数op_i和两个由大小写字母组成的字符串Name1_i, Name2_i,其中op_i只可能为0或1,当op_i=0时,表示判定Name1_i和N

AngcFun的博客 691

hiho刷题日记——第二十二天更为复杂的买卖房屋姿势

题目小Hi和小Ho所关注的街道的长度为N米,从一端开始每隔1米就有一栋房屋,依次编号为0..N,在游戏的最开始,每栋房屋都有一个初始价格,其中编号为i的房屋的初始价格为p_i,之后共计发生了M次事件,所有的事件都是对于编号连续的一些房屋发生的,其中第i次事件如果是房屋自发的涨价或者降价,则被描述为三元组(L_i, R_i, D_i),表示编号在[L_i, R_i]范围内的房屋的价格的增量(即正数为涨

AngcFun的博客 691

hiho刷题日记——第十九天RMQ问题再临-线段树

题目RMQ问题就是在一个范围内求最值的问题。 这个题目还增加了中途可以改变某个值的大小。 这里是利用线段树求最小值。思路线段树其实有二分的思想在里面。比如我知道第1-8个分别的数值。然后我就可以求出1-2,3-4,5-6,7-8的最值,然后求出1-4,5-8的最值,最后求出1-8的最值。以1-8为树根可以建立一棵二叉树。然后在知道范围的时候,可以把要求的范围分解成已经求出的范围最值来更快的得到答

AngcFun的博客 680
上一篇: hiho刷题日记——第十四天无间道之并查集
下一篇: C语言register关键字
昂村饭
博客等级 码龄12年 5粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值