2025年3月GESP八级真题解析
第一题——上学
题目描述
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;
}
第二题——割裂
题面描述
小杨有一棵包含 \(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八级真题解析的更多相关文章
- 《PHP程序员面试笔试真题解析》——新书上线
你好,是我--琉忆.很高兴可以跟你分享我的新书. 很高兴,在出版了PHP程序员面试笔试宝典后迎来了我的第二本书出版--<PHP程序员面试笔试真题解析>. 如果你是一个热爱PHP的程序员,刚 ...
- 互联网最全cka真题解析-2022
1.CKA真题解析kubectl自动补全及帮助信息1.配置kubectl自动补全apt install bash-completion source <(kubectl completion b ...
- 蓝桥杯Java真题解析
上个月参加蓝桥杯省赛拿了个省一,自从比赛完之后就一直没怎么写代码了,还有一个多月就要国赛了,从现在开始准备下国赛,但是我也不想学什么算法,而且我还在准备考研,所以就打算只做下历年的真题,争取国赛拿个国 ...
- python基础---递归函数真题解析
方法一.有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中. 即: {'k ...
- 2021年最新字节跳动Android面试真题解析
概述 时间过得是真TM快,回想自己是16年从学校毕业,现在是出来工作的第五个年头啦.在不同的大小公司都待过,就在前段时间顺利的完成了一次跳槽涨薪,面试了几家公司,最终选择了字节跳动.今特此前来跟大家进 ...
- 2013年蓝桥杯省赛C/C++A组真题解析
1.高斯日记 大数学家高斯有个好习惯:无论如何都要记日记. 他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210 后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的 ...
- 第七届蓝桥杯javaB组真题解析-分小组(第四题)
题目 /* 分小组 9名运动员参加比赛,需要分3组进行预赛. 有哪些分组的方案呢? 我们标记运动员为 A,B,C,... I 下面的程序列出了所有的分组方法. 该程序的正常输出为: ABC DEF G ...
- 第七届蓝桥杯javaB组真题解析-煤球数目(第一题)
题目 /* 煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形), .... 如果一共有100层,共有 ...
- 笔试真题解析 ALBB-2015 算法project师实习生机试
1.用十进制计算30!(30的阶乘),将结果转换成3进制进行表示的话,该进制下的结果末尾会有____个0. [解析] 计算N.下3进制结果末尾有多少个0,事实上就是计算3进制中的3被进位多少次,仅仅要 ...
- 第七届蓝桥杯javaB组真题解析-四平方和(第八题)
题目 /* 四平方和 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多4个正整数的平方和. 如果把0包括进去,就正好可以表示为4个数的平方和. 比如: 5 = 0^2 + 0^2 + 1 ...
随机推荐
- Visual Studio2012编译C#项目时出错“LC.exe”已退出的解决方法
症状: Visual Studio2012编译C#项目时出错"LC.exe"已退出,代码为 -1. 原因: 因为证书的原因,把项目中"properties"目录 ...
- 使用Docker编译PaddlePaddle
在ubuntu中使用Docker编译PaddlePaddle 要在ubuntu中使用docker编译paddle框架,首先分为以下几个步骤: 安装docker环境 拉取paddle的docker镜像 ...
- C# HttpClient 流式响应
有些时候需要边请求边显示响应内容: 用httpClient.SendAsync(httpreq, HttpCompletionOption.ResponseHeadersRead); private ...
- DataV Note:让数据自己讲故事
您是否常常因为面对那些充满各类指标的汇报报告而感到困扰?我们或许能帮到您! 「我们是一家国内的服装公司,财年结束了,公司的销售团队需要对公司的销售数据进行分析,以指导下个财年的作战方向」 「我是浙 ...
- 2025-01-22:使二进制数组全部等于 1 的最少操作次数Ⅱ。用go语言,给定一个二进制数组 nums,你可以对数组进行以下操作任意次(包括0次): 选择任何一个下标 i,并将从该下标开始到数组末
2025-01-22:使二进制数组全部等于 1 的最少操作次数Ⅱ.用go语言,给定一个二进制数组 nums,你可以对数组进行以下操作任意次(包括0次): 选择任何一个下标 i,并将从该下标开始到数组末 ...
- 对比使用DeepSeek与文新一言,了解DeepSeek的关键技术论文
DeepSeek是国内大模型技术的新秀,最近也在业界和媒体界火爆出圈,所以想学习一下其技术. 大模型时代,学习知识,当然首先想到利用大模型,由于在过去一年,对DeepSeek使用不多,所以想和文新一言 ...
- DeepSeek,你是懂.NET的!
这两天火爆出圈的话题,除了过年,那一定是DeepSeek!你是否也被刷屏了? DeepSeek 是什么 DeepSeek是一款由国内人工智能公司研发的大型语言模型,拥有强大的自然语言处理能力,能够理解 ...
- Node.js 与 PostgreSQL 集成:深入 pg 模块的应用与实践
title: Node.js 与 PostgreSQL 集成:深入 pg 模块的应用与实践 date: 2025/2/5 updated: 2025/2/5 author: cmdragon exce ...
- GIS矢量数据获取:全球行政区划、路网、POI点、建筑物范围、信号基站等
本文对目前主要的行政区边界与道路路网.建筑轮廓.POI.手机基站等数据产品的获取网站加以整理与介绍. 目录 5 行政区边界与建筑轮廓.POI.基站数据 5.1 行政区边界数据 5.1.1 DIVA ...
- linux更新软件源 安装docker
vim /etc/aptsources.list 学习参考 https://blog.csdn.net/bskfnvjtlyzmv867/article/details/81044217 # 默认 ...