第一题——上学

题目描述

C 城可以视为由 \(n\) 个结点与 \(m\) 条边组成的无向图。这些结点依次以 \(1,2,…,n\) 标号,边依次以 \(1,2,…,m\) 标号。第 \(i\) 条边(\(1≤i≤m\))连接编号为 \(u_i\) 与 \(v_i\) 的结点,长度为 \(l_i\) 米。

小 A 的学校坐落在 C 城中编号为 \(s\) 的结点。小 A 的同学们共有 \(q\) 位,他们想在保证不迟到的前提下,每天尽可能晚地出门上学。但同学们并不会计算从家需要多久才能到学校,于是找到了聪明的小 A。第 \(i\) 位同学(\(1≤i≤q\))告诉小 A,他的家位于编号为 \(h_i\) 的结点,并且他每秒能行走 \(1\) 米。请你帮小 A 计算,每位同学从家出发需要多少秒才能到达学校呢?

输入格式

第一行,四个正整数 \(n,m,s,q\),分别表示 C 城的结点数与边数,学校所在的结点编号,以及小 A 同学们的数量。

接下来 \(m\) 行,每行三个正整数 \(u_i,v_i,l_i\),表示 C 城中的一条无向边。

接下来 \(q\) 行,每行一个正整数 \(h_i\),表示一位同学的情况。

输出格式

共 \(q\) 行,对于每位同学,输出一个整数,表示从家出发到学校的最短时间。

样例

输入样例 1

5 5 3 3
1 2 3
2 3 2
3 4 1
4 5 3
1 4 2
5
1
4

输出样例 1

4
3
1

数据范围

对于 \(20\%\) 的测试点,保证 \(q=1\)。

对于另外 \(20\%\) 的测试点,保证 \(1≤n≤500,1≤m≤500\)。

对于所有测试点,保证 \(1≤n≤2×10^5,1≤m≤2×10^5,1≤q≤2×10^5\),\(1≤u_i,v_i,s,h_i≤n,1≤l_i≤10^6\)。保证给定的图联通。

分析

这道题其实非常简单,是一道裸的最短路问题,我们只需要从终点出发反着跑就可以了,非常的简单。

#include<bits/stdc++.h>
using namespace std;
const int INF=2e5+10; struct Node{
long long v,num;
bool operator <(const Node &a)const{
return num>a.num;
}
}; vector<Node> mp[INF];
long long dis[INF],used[INF];
priority_queue<Node> q; void dijkstra(int x){
dis[x]=0,q.push({x,0});
while (!q.empty()){
long long u=q.top().v;q.pop();
if (used[u]==1)continue;
used[u]=1;
int len=mp[u].size();
for (int i=0;i<len;i++){
long long v=mp[u][i].v,w=mp[u][i].num;
if (dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
q.push({v,dis[v]});
}
}
}
} int main(){
int n,m,s,q;
cin>>n>>m>>s>>q;
for (int i=1;i<=n;i++){
dis[i]=1e18;
}
for (int i=1;i<=m;i++){
long long u,v,l;
cin>>u>>v>>l;
mp[u].push_back({v,l});
mp[v].push_back({u,l});
}
dijkstra(s);
for (int i=1;i<=q;i++){
int t;
cin>>t;
cout<<dis[t]<<endl;
}
return 0;
}

广告

最短路算法——CSDN

最短路算法——博客园

第二题——割裂

题面描述

小杨有一棵包含 \(n\) 个节点的树,其中节点的编号从 \(1\) 到 \(n\)。

小杨设置了 \(a\) 个好点对<\(u_1\),\(v_1\)>,<\(u_2\),\(v_2\)>,...,<\(u_a\),\(v_a\)>和 1 个坏点对 <\(b_u\),\(b_v\)>。一个节点能够被删除,当且仅当:

删除该节点后对于所有的 \(i(1≤i≤a)\),好点对 \(u_i\) 和 \(v_i\) 仍然连通;

删除该节点后坏点对 \(b_u\) 和 \(b_v\) 不连通。

如果点对中的任意一个节点被删除,其视为不连通。

小杨想知道,有多少个节点能够被删除。

输入格式

第一行包含两个正整数 \(n,a\),含义如题面所示。

之后 \(n−1\) 行,每行包含两个正整数 \(x_i,y_i\),代表存在一条连接节点 \(x_i\) 和 \(y_i\) 的边。

之后 \(a\) 行,每行包含两个正整数 \(u_i,v_i\),代表一个好点对 <\(u_i,v_i\)>。

最后一行包含两个正整数 \(b_u,b_v\),代表坏点对 <\(b_u,b_v\)>。

输出格式

输出一个正整数,代表能够删除的节点个数。

样例

输入样例

6 2
1 3
1 5
3 6
3 2
5 4
5 4
5 3
2 6

输出样例

2

数据范围

对于全部数据,保证有 \(1≤n≤10^6,0≤a≤10^5,ui≠vi,bu≠bv\)。

分析

这道题其实还有点思维含量,根据题目,我们要知道那些点是能删的,那些点是不能删的,基于此,我们就要维护出来每个点被那些点所经过了,或者说被经过了几次,如果说一个点没有被任何的好点经过,并且被坏点经过了,那么就说明这个点是可以被删除的,我这里说的被好点经过指的是两个好点之间的路径哈,不要搞错了。

如果说思路是这样的话,我们是不是就可以很显然想到一个做法,树上差分?而且这个是一个非常简答的点差分,所以说没有任何的难度好吧。

#include<bits/stdc++.h>
using namespace std;
const int INF=1e6+10; vector<int> mp[INF];
int dp[INF][30],deep[INF],p[INF],d[INF]; void prepare(int x,int fa){
for (int i=1;(1<<i)<=deep[x]-1;i++){
dp[x][i]=dp[dp[x][i-1]][i-1];
}
int len=mp[x].size();
for (int i=0;i<len;i++){
if (mp[x][i]==fa)continue;
int t=mp[x][i];
dp[t][0]=x,deep[t]=deep[x]+1;
prepare(t,x);
}
}
int getroot(int x,int y){
if (deep[x]<deep[y])swap(x,y);
int index=__lg(deep[x]-deep[y]);
for (int i=index;i>=0;i--){
if (deep[dp[x][i]]>=deep[y])x=dp[x][i];
if (deep[x]==deep[y])break;
}
if (x==y)return x;
for (int i=20;i>=0;i--){
if (dp[x][i]!=dp[y][i])x=dp[x][i],y=dp[y][i];
}
return dp[x][0];
} void get_p(int x,int fa){
int len=mp[x].size();
for (int i=0;i<len;i++){
if (mp[x][i]==fa)continue;
int t=mp[x][i];
get_p(t,x);
p[x]+=p[t];
}
} void get_d(int x,int fa){
int len=mp[x].size();
for (int i=0;i<len;i++){
if (mp[x][i]==fa)continue;
int t=mp[x][i];
get_d(t,x);
d[x]+=d[t];
}
}
int main(){
int n,a;
cin>>n>>a;
for (int i=1;i<n;i++){
int u,v;
cin>>u>>v;
mp[u].push_back(v);
mp[v].push_back(u);
}
deep[1]=1;
prepare(1,-1);
for (int i=1;i<=a;i++){
int u,v;
cin>>u>>v;
int root=getroot(u,v);
p[u]++,p[v]++,p[root]--,p[dp[root][0]]--;
}
get_p(1,-1);
int b1,b2;
cin>>b1>>b2;
int root=getroot(b1,b2);
d[b1]++,d[b2]++,d[root]--,d[dp[root][0]]--;
get_d(1,-1);
int cnt=0;
for (int i=1;i<=n;i++){
if (d[i]&&!p[i])cnt++;
}
cout<<cnt;
return 0;
}

总结

这次的八级题不算难,只不过前面的选择题和判断题CCF出错了,所以说耽误了一点时间,对于基础比较好的人来说,这套八级的题大概是可以在1个半小时内做完的(像我这么一个蒟蒻,都只花了差不多1个小时)

2025年3月GESP八级真题解析的更多相关文章

  1. 《PHP程序员面试笔试真题解析》——新书上线

    你好,是我--琉忆.很高兴可以跟你分享我的新书. 很高兴,在出版了PHP程序员面试笔试宝典后迎来了我的第二本书出版--<PHP程序员面试笔试真题解析>. 如果你是一个热爱PHP的程序员,刚 ...

  2. 互联网最全cka真题解析-2022

    1.CKA真题解析kubectl自动补全及帮助信息1.配置kubectl自动补全apt install bash-completion source <(kubectl completion b ...

  3. 蓝桥杯Java真题解析

    上个月参加蓝桥杯省赛拿了个省一,自从比赛完之后就一直没怎么写代码了,还有一个多月就要国赛了,从现在开始准备下国赛,但是我也不想学什么算法,而且我还在准备考研,所以就打算只做下历年的真题,争取国赛拿个国 ...

  4. python基础---递归函数真题解析

    方法一.有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中. 即: {'k ...

  5. 2021年最新字节跳动Android面试真题解析

    概述 时间过得是真TM快,回想自己是16年从学校毕业,现在是出来工作的第五个年头啦.在不同的大小公司都待过,就在前段时间顺利的完成了一次跳槽涨薪,面试了几家公司,最终选择了字节跳动.今特此前来跟大家进 ...

  6. 2013年蓝桥杯省赛C/C++A组真题解析

    1.高斯日记 大数学家高斯有个好习惯:无论如何都要记日记. 他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210 后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的 ...

  7. 第七届蓝桥杯javaB组真题解析-分小组(第四题)

    题目 /* 分小组 9名运动员参加比赛,需要分3组进行预赛. 有哪些分组的方案呢? 我们标记运动员为 A,B,C,... I 下面的程序列出了所有的分组方法. 该程序的正常输出为: ABC DEF G ...

  8. 第七届蓝桥杯javaB组真题解析-煤球数目(第一题)

    题目 /* 煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形), .... 如果一共有100层,共有 ...

  9. 笔试真题解析 ALBB-2015 算法project师实习生机试

    1.用十进制计算30!(30的阶乘),将结果转换成3进制进行表示的话,该进制下的结果末尾会有____个0. [解析] 计算N.下3进制结果末尾有多少个0,事实上就是计算3进制中的3被进位多少次,仅仅要 ...

  10. 第七届蓝桥杯javaB组真题解析-四平方和(第八题)

    题目 /* 四平方和 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多4个正整数的平方和. 如果把0包括进去,就正好可以表示为4个数的平方和. 比如: 5 = 0^2 + 0^2 + 1 ...

随机推荐

  1. 开源即时通讯IM框架MobileIMSDK的鸿蒙NEXT端开发快速入门

     相关链接: ① MobileIMSDK-鸿蒙端的详细介绍 ② MobileIMSDK-鸿蒙端的开发手册new(* 精编PDF版) 一.理论知识准备 您需要对鸿蒙Next和ArkTS开发有所了解: 1 ...

  2. 【吐血经验】在 windows 上安装 spark 遇到的一些坑 | 避坑指南

    在 windows 上安装 spark 遇到的一些坑 | 避坑指南 最近有个活:给了我一个阿里云桌面(windows 10系统),让我在上面用 scala + spark 写一些东西. 总是报错不断, ...

  3. 老生常谈——分布式限流:部分Sentinal源码解读

    基础知识 HTTP CODE = 429 "请求过多" A. 限流的类型 服务端 客户端 限流的标的 IP 用户 ... 基本要求 准确限制过量的请求. 低延时.限流器不能拖慢HT ...

  4. .NetCore Docker test

    Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 ...

  5. React、Angular、Vue.js三者比较指南

    Vue-React-Angular三者区别   1. 基本概念Angular 是一个应用设计框架与开发平台,用于创建高效.复杂.精致的单页面应用. React 是一个用于构建用户界面的 JavaScr ...

  6. 配置计算节点之间的SSH

    本文分享自天翼云开发者社区<配置计算节点之间的SSH>,作者:y****n 如果在管理程序之间调整或迁移实例,可能会遇到SSH(拒绝权限)错误.请确保每个节点都配置了SSH密钥验证,以便C ...

  7. 登上国际舞台!天翼云P4 EIP网关流量管理创新方案亮相CCGrid 2024!

    5月8日,第24届IEEE/ACM集群.云和互联网计算国际研讨会(CCGrid 2024)在美国费城隆重举行.来自中国.美国.印度.法国等国家的学术及产业界代表齐聚一堂,围绕云计算相关议题进行深入探讨 ...

  8. 彰显科技硬实力!天翼云论文在国际顶刊JoCCASA发表!

    近日,由天翼云科技有限公司云网产品事业部混合云团队完成的论文<Multivariate Time Series Collaborative Compression for Monitoring ...

  9. QR防伪溯源系统追溯原理是什么?

    本文分享自天翼云开发者社区<QR防伪溯源系统追溯原理是什么?>,作者:SD万 QR防伪溯源系统是一种基于QR技术的防伪技术,通过为每件产品生成唯一的QR标签,并将其与产品信息.生产信息.物 ...

  10. Linux中ARP学习和老化机制

    本文分享自天翼云开发者社区<Linux中ARP学习和老化机制> 作者:云云生息 ARP学习和老化机制在Linux网络通信中起着至关重要的作用.ARP(Address Resolution ...