首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
我是二哈
浙江外国语学院 Java
发布于浙江
关注
已关注
取消关注
@tangren:
题解 | 国旗计划(倍增:区间最值)
国旗计划:原题链接题意: 输入:第一行给你一个n和m,n代表边防战士的人数,m代表总共有几个站点,接下来有n行,每行给你两个站点C和D,战士行走的区间为[C,D],区间会重叠,但不会完全覆盖。 输出:输出每个战士,在以他自身的区间为起点的前提下,至少需要多少人可以使战士之间行走的区间形成一个环。做题思路: 初步入手本题,可以想到如果要判断成环,最好的办法是将环拆分成链,即当右边的点小于左边的点时,说明该点跨过了环,因此将右边的点加上站点总数,即可生成假设在一条链上的两点间的距离。初始输入代码: cin >>n>>m; for (int i=1;i<=n;i++) { cin >>w[i].l>>w[i].r; //破环成链 if (w[i].r<w[i].l)w[i].r+=m; } 在生成完链后,题目要求也变成了找到覆盖3-10的这个区间,问题是该怎么求解,找到最少的人数去覆盖这个区间,这里可以先试用贪心的思想进行思考,因为战士之间的区间是不会完全覆盖的,所以只要每次是下一个选中区间的起点是当前区间中,最靠近选择区间末的区间,即可完成最少人数成环这一条件。 以此为依据,在原先来链的基础上,再copy(复制)一份每个区间都加上一个环时的情况,用以判断当区间跨过环时,存在2-5的区间,但无法求解的情况,同时,因为题目只规定了战士不会被完全覆盖,但其顺序可能是被打乱的,所以为了满足区间查找的单调性,对数组进行sort排序。改进后输入代码: //输入+处理 cin >>n>>m; for (int i=1;i<=n;i++) { //记录id,在输出结果时,是原序输出 w[i].id=i; cin >>w[i].l>>w[i].r; //破环成链 if (w[i].r<w[i].l)w[i].r+=m; } //起点排序 sort(w+1,w+n+1); //复制一份 n2=n*2; for (int i=n+1;i<=n2;i++) { w[i]=w[i-n]; w[i].l+=m; w[i].r+=m; } 接下来是查找区间,但注意,如果直接查找区间会导致是o(n^2)的时间复杂度,也就是超时,因此需要优化区间查找,为此,来到本次题解的重中之中,倍增(st)。 在使用倍增前,先了解倍增的使用条件:必须要有单调性,很显然,这个条件已经满足。 其次是倍增的原理:同二分一样,二分的作用是不断缩减数组,以此来找到需要的数,而倍增则是不断增大。它的运算原理可以参考二进制定理:2^n=2^(n-1)+2^(n-2)+...+2^0+1。 因此其运行规则为:先走2^n步,倘若大于等于数值则说明步数过多,倘若小于,将将步数加上2^n,加至最后,加起来的总步数会是要求步数-1的值。st的代码://贪心选择区间+st生成静态数据void st(){ //自建图: int next=1; //链上共n2条 for (int i=1;i<=n2;i++) { //找到每个区间离右端点最近的左端点所在的区间 while (next <= n2 && w[next].l<= w[i].r)next++; //记录区间 go[i][0]=next-1; } //倍增:i = 1,2,4,8,16..共 logn 次 for (int i=1;(1 << i)<=n;i++) { //枚举每条线段 for (int s=1;s<=n2;s++) { //若走2^3步,2^3= 2^2+2^2 //先从 s 到走2^2步到中转站 //再从中转站走2^2到终点 go[s][i]=go[go[s][i-1]][i-1]; } }} 构建完图后,即可运用图表进行求解每位士兵的最少人数,即st的调用。//st的使用 void getRes(int x){ //len为终点长度,该长度代表能否成环 //now为初始的节点 //ans记录人数,因为放入了自身的初始节点,所以人数至少为1 int len=w[x].l+m,now=x,ans=1; //i初始为log2(n),20是为了方便计算 for (int i=20;i>=0;i--) { //从大到小开始查找 int to=go[now][i]; //当to存在,长度在len内 if (to && w[to].r<len) { ans=ans+(1<<i); //累加跳过的区域 now=to;//从新位置开始 } } //记录时使用id记录人数,毕竟sort过了,但输出要使用原序列 //ans+1因为ans是小于len的,还无法成环, //但因为st性质,他的下一步必定大于len,此时可以成环 res[w[x].id]=ans+1;} 最后直接输出存入的数值,即可得出答案,这里直接放ac代码:#include <bits/stdc++.h>using namespace std;const int maxn = 4e5 + 10;int n, n2, m;struct Index{ int id,l,r;//编号+区间 //以起始点小的排序 bool operator<(const Index &b) const { return l< b.l;}};Index w[maxn*2];//破环成链,因此空间需要开两份int go[maxn][25];//倍增记录自建图int res[maxn];//记录结果//贪心选择区间+st生成静态数据void st(){ //自建图: int next=1; //在链上选择共n2条 for (int i=1;i<=n2;i++) { //每个区间的下一个右端点最大的区间 while (next <= n2 && w[next].l<= w[i].r)next++; //区间i的下一个区间 go[i][0]=next-1; } //倍增:i = 1,2,4,8,16..共 logn 次 for (int i=1;(1 << i)<=n;i++) { //枚举每条线段 for (int s=1;s<=n2;s++) { //若走 2^3 步,2^3= 2^2+2^2 //先从 s 到走2^2步到中转站 //再从中转站走2^2到终点 go[s][i]=go[go[s][i-1]][i-1]; } }}//st的使用 void getRes(int x){ //len为终点长度,该长度代表能否成环 //now为初始的节点 //ans记录人数,因为放入了自身的初始节点,所以人数至少为1 int len=w[x].l+m,now=x,ans=1; //i初始为log2(n),20是为了方便计算 for (int i=20;i>=0;i--) { //从大到小开始查找 int to=go[now][i]; //当to存在,长度在len内 if (to && w[to].r<len) { ans=ans+(1<<i); //累加跳过的区域 now=to;//从新位置开始 } } //记录时使用id记录人数,毕竟sort过了,但输出要使用原序列 //ans+1因为ans是小于len的,还无法成环, //但因为st性质,他的下一步必定大于len,此时可以成环 res[w[x].id]=ans+1;}int main(){ //输入+初步处理 cin >>n>>m; for (int i=1;i<=n;i++) { w[i].id=i; cin >>w[i].l>>w[i].r; //破环成链 if (w[i].r<w[i].l)w[i].r+=m; } //起点排序 sort(w+1,w+n+1); //复制一份 n2=n*2; for (int i=n+1;i<=n2;i++) { w[i]=w[i-n]; w[i].l+=m; w[i].r+=m; } //倍增(st)开始 st(); //循环得出每个节点的最少成环人数 for (int i=1;i<=n;i++)getRes(i); //输出答案 for (int i=1;i<=n;i++)cout <<res[i]<<" "; cout <<"\n"; return 0;}
点赞 1
评论 1
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
09-10 22:24
已编辑
西北工业大学 Java
华为Ai岗机考20250903完整真题
华为Ai岗机考20250903 华为自26届秋招(2025年起)对AI岗位机考进行了改革,考试题型调整为20道选择题(15道单选(6分)+5道不定项选择(12分))+2道编程题(150+300)。 题目核心围绕人工智能技术(如Transformer架构、EM算法、PCA降维、激活函数等)与数学基础(如线性变换、概率分布、数值迭代、插值计算等)展开,相较于以往题型,知识覆盖面与考查深度均有显著变化。 目前,网络上针对此次改革后AI岗位的完整机考试卷资源较为稀缺。本次特别整理并提供2025年9月3日华为AI岗位机考的完整真题。希望对读者备考提供一定的帮助,祝大家都顺利上岸! 整理不易,麻烦给个免费...
Silencer76:
牛客上面也有对应真题试卷 https://www.nowcoder.com/exam/test/63699094/summary?channelPut=bszthz2025
投递华为技术有限公司等公司10个岗位
点赞
评论
收藏
分享
08-21 10:11
已编辑
南京邮电大学 Java
大爱mentor
mentor人好又幽默,人格魅力拉满了有问题mentor开玩笑两句,然后默默帮改代码,mentor每次都是加班最多的,也很有实力,大家都叫他老师
Java后端劝退第一...:
我mentor也人很好,感觉就是同龄人,昨天出去散步看他摘了根狗尾巴草一直转,特别搞笑
你被mentor骂过吗?
点赞
评论
收藏
分享
08-02 11:24
门头沟学院 数据仓库
BOSS上第一次有人跟我这么说
秋招以来,一直都是感谢信,感谢信,感谢信,您与我公司需求不匹配,第一次有人在BOSS上这么安慰我😭😭😭😭😭
怎么又出bug:
第一眼没看到硬字
我的求职精神状态
点赞
评论
收藏
分享
09-10 15:49
香港大学 推荐算法
华为留学生笔试 华为笔试 0828
笔试时间:2025年8月28日往年笔试合集:2023春招秋招笔试合集2024春招秋招笔试合集第一题:基于决策树预判资源调配优先级在无线通信系统中为了资源调配更加合理和及时,需要对未来一段时间网络的负载做出预判以确定资源调配的优先级。决策树是一种常用的模型,可以根据采集到的状态数据,结合时间段、天气等因素来推测合理的资源调配优先级。现在将一个训练好的分类决策树模型 Tree 安装在系统中,请实现决策树的推算算法,根据输入特征返回资源调配优先级。输入描述输入包含多行数据:首行是属性参数;后续 (m) 行是决策树模型的结构数据;再后续 (n) 行是待推理的样本。1. 属性参数(首行)包含 3 个 i...
投递华为技术有限公司等公司10个岗位
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
大二拿下15k量化岗和多家大厂
2.0W
2
...
签完三方了,分享下我的“反向提问”技巧
1.6W
3
...
小红书校招技术岗增2.5倍!课代表来总结一下这场直播吧
1.4W
4
...
出身寒微,却攥住鹅厂的入场券
1.2W
5
...
机械八股之材料力学笔面试难点与常考点整理
9003
6
...
真有人600分报民办大学嘛?
8159
7
...
小米全面对标iPhone,这是传说中的删16计?
7459
8
...
无良二房东受死吧!
6527
9
...
毕业保底25w年薪,福耀大学还是太超前了
4835
10
...
大学要都这样教,大家也不至于这么卷吧...
4501
创作者周榜
更多
正在热议
更多
#
秋招报数:你投了多少家公司?
#
10704次浏览
94人参与
#
我的租房踩坑经历
#
165127次浏览
1112人参与
#
小红书校招直播来了
#
74650次浏览
435人参与
#
秋招的嫡长offer
#
8835次浏览
108人参与
#
你面试被问到过哪些不会的问题?
#
5343次浏览
255人参与
#
聊聊这家公司值得去吗
#
532751次浏览
3567人参与
#
深信服求职进展汇总
#
220387次浏览
1744人参与
#
电网笔面经互助
#
44392次浏览
425人参与
#
为什么国企只招应届生
#
196051次浏览
1209人参与
#
为了求职,我做过的疯狂伪装
#
1829次浏览
36人参与
#
职场破冰,你们都聊什么?
#
596次浏览
19人参与
#
你觉得早上几点上班合适?
#
80281次浏览
327人参与
#
我的第一份实习怎么找的
#
151304次浏览
1442人参与
#
嵌入式岗知多少
#
52169次浏览
522人参与
#
上班摸鱼,你都在干些什么?
#
1205次浏览
40人参与
#
当你面对裁员会如何?
#
303099次浏览
2557人参与
#
实习生应该准时下班吗
#
277990次浏览
1556人参与
#
你后悔选择现在的专业吗
#
94235次浏览
689人参与
#
bilibili求职进展汇总
#
77084次浏览
707人参与
#
你今年的平均薪资是多少?
#
141885次浏览
703人参与
#
中兴工作体验
#
32914次浏览
294人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务