蓝桥杯第十六讲--疑难杂题(二)

简介: 蓝桥杯第十六讲--疑难杂题

距离

题目要求

题目描述:

image.png

输入格式:

image.png

输出格式:

m 行,对于每次询问,输出一行询问结果。

数据范围:

image.png

输入样例1:

2 2 
1 2 100 
1 2 
2 1

输出样例1:

100
100

输入样例2:

3 2
1 2 10
3 1 15
1 2
3 2

输出样例2:

10
25

思路分析

Tarjan-离线求LCA

在线做法:读一个询问,处理一个,输出一个

离线做法:读完全部询问,再全部处理完,再全部输出

在深度优先遍历时,将所有点分成三大类

2 号点:代表已经访问并结束回溯

1  号点:代表正在访问

0  号点:代表还没有访问过

其中所有 2  号点和正在搜索的 1  号点路径中已经通过并查集合并成一个集合

7.png

image.png

代码

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef pair<int, int> PII;
const int N = 10010, M = N * 2;
int n, m;
int h[N], e[M], w[M], ne[M], idx;
int dist[N];
int p[N];
int res[M * 2];
int st[N];
vector<PII> query[N];   // first存查询的另外一个点,second存查询编号
void add(int a, int b, int c)
{
    e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
}
void dfs(int u, int fa)
{
    for (int i = h[u]; ~i; i = ne[i])
    {
        int j = e[i];
        if (j == fa) continue;
        dist[j] = dist[u] + w[i];
        dfs(j, u);
    }
}
int find(int x)
{
    if (p[x] != x) p[x] = find(p[x]);
    return p[x];
}
void tarjan(int u)
{
    st[u] = 1;
    for (int i = h[u]; ~i; i = ne[i])
    {
        int j = e[i];
        if (!st[j])
        {
            tarjan(j);
            p[j] = u;
        }
    }
    for (auto item : query[u])
    {
        int y = item.first, id = item.second;
        if (st[y] == 2)
        {
            int anc = find(y);
            res[id] = dist[u] + dist[y] - dist[anc] * 2;
        }
    }
    st[u] = 2;
}
int main()
{
    scanf("%d%d", &n, &m);
    memset(h, -1, sizeof h);
    for (int i = 0; i < n - 1; i ++ )
    {
        int a, b, c;
        scanf("%d%d%d", &a, &b, &c);
        add(a, b, c), add(b, a, c);
    }
    for (int i = 0; i < m; i ++ )
    {
        int a, b;
        scanf("%d%d", &a, &b);
        if (a != b)
        {
            query[a].push_back({b, i});
            query[b].push_back({a, i});
        }
    }
    for (int i = 1; i <= n; i ++ ) p[i] = i;
    dfs(1, -1);
    tarjan(1);
    for (int i = 0; i < m; i ++ ) printf("%d\n", res[i]);
    return 0;
}

模拟散列表

题目要求

题目描述:

image.png

输入格式:

image.png

输出格式:

image.png

数据范围:

image.png

输入样例:

5
I 1
I 2
I 3
Q 2
Q 5

输出样例:

Yes
No

思路分析

板子题,需要对代码关键部分进行背诵,详细的代码逻辑解释见博客:哈希表

代码

#include <cstring>
#include <iostream>
using namespace std;
const int N = 200003, null = 0x3f3f3f3f;
int h[N];
int find(int x)
{
    int t = (x % N + N) % N;
    while (h[t] != null && h[t] != x)
    {
        t ++ ;
        if (t == N) t = 0;
    }
    return t;
}
int main()
{
    memset(h, 0x3f, sizeof h);
    int n;
    scanf("%d", &n);
    while (n -- )
    {
        char op[2];
        int x;
        scanf("%s%d", op, &x);
        if (*op == 'I') h[find(x)] = x;
        else
        {
            if (h[find(x)] == null) puts("No");
            else puts("Yes");
        }
    }
    return 0;
}



目录
相关文章
|
XML Java 数据库连接
mybatis-plus逆向工程详解
mybatis-plus逆向工程详解
762 0
|
网络协议 Windows
解决GitHub Pages制作的个人博客无法访问的问题
最近一段时间应该有很多小伙伴发现自己辛苦做的个人博客无法访问了吧。
|
存储 关系型数据库 数据库
极简开发,极速上线:构建端到端大模型应用
本文将以一个经典的 RAG(检索增强生成)知识问答系统为例,详细介绍从智能体设计到最终应用部署的全流程。
1846 82
|
缓存 移动开发 前端开发
HTTP请求走私漏洞原理与利用手段分析
HTTP请求走私漏洞原理与利用手段分析
927 1
|
前端开发 Java 微服务
微服务之间调用的异常应该如何处理
在分布式服务的场景下,业务服务都将进行拆分,不同服务之间都会相互调用,如何做好异常处理是比较关键的,可以让业务人员在页面使用系统报错后,很清楚的看到服务报错的原因,而不是返回代码级别的异常报错,比如NullException、IllegalArgumentException、FeignExecption等异常报错,这样就会让非技术人员看到了一头雾水,从而很降低用户的体验感。
|
Prometheus Kubernetes 监控
【 Kubernetes的Kiali、prometheus、grafana和ELK系统】
【 Kubernetes的Kiali、prometheus、grafana和ELK系统】
676 0
|
应用服务中间件 nginx
|
负载均衡 安全 Dubbo
深入浅出微服务:40个微服务架构实战案例(Dubbo+Springcloud)
微服务在近几年来可以说是十分火爆,我们应该知道微服务的发展历程大致分为6个阶段分别是:单体应用阶段提、垂直应用阶段、分布式系统阶段、服务治理阶段、微服务阶段、最后到服务网格阶段。
|
存储 弹性计算 编解码
阿里云服务器4核8G配置最新价格及带宽和云盘收费价格整理
本文介绍了阿里云服务器4核8G配置最新的租用费用,包含收费标准及最新活动价格和公网带宽和系统盘收费情况以及后续升级续费最新优惠政策等。
2380 0
阿里云服务器4核8G配置最新价格及带宽和云盘收费价格整理
|
消息中间件 设计模式 移动开发
最全的前端面试题、后端面试题、包含大厂面试题2022年最新
整理了一下前端和java后端的面试及大厂面试题,都是我自己自用的,比较珍贵,整理不易。
722 0
最全的前端面试题、后端面试题、包含大厂面试题2022年最新

热门文章

最新文章