首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
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
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
昨天 19:51
北京交通大学 C++
如果你的简历能扛住“千亿级”并发,请直接私信我
日产千亿级消息、包裹量占全球 1/4、日活过亿。当你看到这些数字时,第一反应是宏观数据,但在我眼里,它们是实打实的技术压力测试。我是 Temu 基础平台的一名底层开发。如果你还在纠结要不要投那些已经“红海”到不行的国内电商业务,听我一句:去有增量的地方,去技术能直接换钱的地方。1. 这种机会,这辈子可能就这一次国内互联网早已进入“修补匠”时代,但在 Temu 基础平台,我们还在“造起重机”。拉美、中东、东南亚才刚开荒,多国架构、跨国中间件自研、千万级并发支撑……这里有大把真实的、前人没解决过的技术深水区等着你来填。2. “稳”得不像话在内卷的大环境下,我们组的离职率低得离谱,三十岁以上的老兵比...
点赞
评论
收藏
分享
昨天 22:41
拼多多集团-PDD_TEMU_研发工程师
大模型算法工程师:入门面试级(含内推码)
一、 面试流程概览通常,大厂校招面试会包含以下环节:简历筛选:你的学历、项目经历、论文、竞赛成绩、实习经历是第一道门槛。笔试/在线测评:考察算法编程能力(LeetCode中等/困难难度)、基础数学和机器学习知识。技术面试(2-4轮):核心环节,每轮侧重点可能不同:一轮基础深度面:深入考察机器学习、深度学习基础。一轮大模型专项面:深入考察LLM、NLP相关知识和你的项目。一轮代码实现面:考察算法题和模型核心组件的代码实现能力。一轮交叉面/BOSS面:可能涉及更宏观的问题、团队匹配度、研究规划等。HR面试:考察软实力、职业动机、性格、薪资期望等。二、 核心知识体系这是你需要掌握的硬核知识,必须做到...
点赞
评论
收藏
分享
02-24 19:32
广西科技大学 IT技术支持
25届的同学们,毕业之后工作都好吗
快刀斩offer:
干测试,项目组就我一个测试,准备在职考研跑路了
点赞
评论
收藏
分享
03-03 21:32
上海电机学院 产品经理
这个它石是真的恶心,一天就给我结束了。看了一下JD,估计就是卡学历,非要985/211吐了。。。。
陶喆:
小米给我985都卡了,那我还能说啥
点赞
评论
收藏
分享
昨天 15:32
已编辑
河南大学 Java
易视腾(朗新子公司)40min技术面
就一轮技术,偏八股也不难,可以结合实习或者项目去说;面试官人很好不压力,简历没写的不会问(虽然好多写了的也没问)。1.线程有几种状态。2.Java创建线程方法。3.继承Thread和实现Runnable有什么区别。4.Java多线程怎么用。5.线程池核心参数,什么时机创建救急线程。6.死锁了解吗。7.多线程下要考虑什么问题,怎么解决,volatile就能保证线程安全了吗。8.了解什么锁,Synchronized和ReentrantLock用法上有什么区别。9.反射了解吗,项目中有使用吗(回答没有),了解反射应用场景吗(答的AOP的CGLIB)。10.设计模式了解哪些,讲讲适配器模式。11.Ja...
查看24道真题和解析
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
游戏客户端面经及经历分享
4456
2
...
wxg 一面
2945
3
...
3.6 京东创新零售一面凉经
2715
4
...
字节AI agent算法一面 好难啊
2213
5
...
学历一般的我,准备凭借Ai项目在春招冲出重围,附上开源!
1909
6
...
前端转agent是如何拿到三个大厂offer的
1894
7
...
AI-Agent 面试题汇总 - 大模型篇
1810
8
...
腾讯 游戏客户端 面经
1720
9
...
26届Java简历求评价
1131
10
...
全力all in转正还是暑期另一段大厂
1015
创作者周榜
更多
正在热议
更多
#
春招 / 实习投递,你最焦虑的一件事
#
4835次浏览
64人参与
#
HR问:你期望的薪资是多少?如何回答
#
80114次浏览
679人参与
#
神州信息求职进展汇总
#
4680次浏览
74人参与
#
今年找实习到底有多难?
#
2606次浏览
31人参与
#
27届求职交流
#
21094次浏览
420人参与
#
今天你投了哪些公司?
#
3429次浏览
96人参与
#
26届求职交流
#
10531次浏览
279人参与
#
工作丧失热情的瞬间
#
366727次浏览
2557人参与
#
快手求职进展汇总
#
737637次浏览
7115人参与
#
双非能在秋招上岸吗?
#
378260次浏览
1875人参与
#
国企/银行/研究所公司爆料
#
195172次浏览
900人参与
#
三月的小目标
#
31325次浏览
590人参与
#
实习要如何选择和准备?
#
147854次浏览
1569人参与
#
交出你的校招焚诀
#
22128次浏览
338人参与
#
听劝,这个公司值得去吗
#
678827次浏览
2000人参与
#
求职遇到的搞笑事件
#
165355次浏览
902人参与
#
面试___岗的必刷题单
#
24758次浏览
454人参与
#
哪些公司开暑期实习了?
#
40566次浏览
330人参与
#
面试中,你被问过哪些奇葩问题?
#
89079次浏览
851人参与
#
你觉得mentor喜欢什么样的实习生
#
51806次浏览
1009人参与
#
24秋招避雷总结
#
953971次浏览
7052人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务