首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
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
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
07-01 19:49
门头沟学院 客户端其它
如何在“没人管”时学到核心技能
大多数实习都能学到真东西。 它是你迈向正式工作的第一步。通常,公司会给予实习生一定权限,使其能接触到一定程度的核心逻辑。针对“实习只干杂活,不派开发任务”的说法,请仔细看以下几点:一、始终保持学习的习惯 实习之初,你连规范的开发流程都不熟悉,如何能承担开发任务?分配给你,你能按时完成吗?每个任务都有节点,若你延误,你的上级乃至整个小组都可能受影响。所以,实习的第一步是学习:熟练使用公司内部系统,深入理解项目代码逻辑。把自己当作真正的开发者,先读懂代码是硬道理。二、要善于提问 学习过程中必然会遇到难点。即使问了AI也可能一知半解,但你想弄懂,怎么办?最直接的方式是问人。关键是要“会问”:找对人,...
工作相关事情
点赞
评论
收藏
分享
07-01 17:23
武汉轻工大学 运营
找不到工作就天天调戏hr
天天招聘软件刷烂了 也找不到合适的工作看得出来我很颠,克制不住的犯贱啊哈哈哈哈
码农索隆:
《两个女人一台戏》
点赞
评论
收藏
分享
05-28 01:36
门头沟学院 Java
在深圳java开发应届生报价9k都要被😓了吗
在boss上投了个简历,因为在深圳我就报了9k的期望薪资,因为本人加起来三段实习经历总共小一年的实习时长,而且我目前的工作在佛山转正也有7.5k,所以我觉得这个价也正常吧,没想到就被hr发😅了,我发回去还阴阳我😂
永不遗忘:
畅飞扬是吧,上黑名单
@牛客吹哨人
奇葩时刻大赏
点赞
评论
收藏
分享
06-12 00:42
已编辑
北京月之暗面科技有限公司_Search & Rec_aigc工程师(实习员工)
逃课的学生技术靠谱吗?
如图✋️😇
水墨不写bug:
疑似没有上过大学
点赞
评论
收藏
分享
不愿透露姓名的神秘牛友
07-01 14:40
两年前的今天高考出分 松弛的爸妈和我
出分的那天上午我爸在上班 我妈出门采购 我睡到十点才醒 一家人就这样松弛(现在想想可能他们是怕我紧张) 其实查到的那一刻内心毫无波澜 一个可以预料到的中规中矩的数字 虽然后来后知后觉有点遗憾但还是当机立断宰了我爸一顿 就这么贪财不知不觉都两年前了 2025也要过去一半了 在南大遇到很多好朋友 还是相信一切都是最好的安排
高考出分的那一天,我__
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
美团面经,已oc
3.1W
2
...
我是一个能独当一面的大人吗
1.3W
3
...
大家觉得测试还能活多久
1.1W
4
...
我举报了室友面试作弊
7122
5
...
大家在大厂实习会发朋友圈吗
6021
6
...
25届校招入职一周,目前感觉良好
5495
7
...
面试稀烂但是拿到大厂offer了...
5385
8
...
工资不花,难道存起来?
5056
9
...
加班到十点,连续加班两个星期,这是实习生的强度吗?
4470
10
...
现在每天上午八股,下午实习,晚上算法
4208
创作者周榜
更多
正在热议
更多
#
你觉得实习能学到东西吗
#
31183次浏览
634人参与
#
机械人集合!你是什么工程师?
#
15374次浏览
89人参与
#
现代汽车前瞻技术研发急速编程挑战赛
#
26048次浏览
212人参与
#
秋招什么时候开投比较合适?
#
19223次浏览
275人参与
#
发工资后,你做的第一件事是什么
#
67596次浏览
229人参与
#
如何准备秋招
#
18240次浏览
350人参与
#
百度工作体验
#
219454次浏览
1959人参与
#
机械人与华为的爱恨情仇
#
116250次浏览
942人参与
#
工作中哪个瞬间让你想离职
#
25491次浏览
177人参与
#
硬件应届生薪资是否普遍偏低?
#
73639次浏览
514人参与
#
不考虑转正,实习多久合适
#
31629次浏览
145人参与
#
影石Insta360求职进展汇总
#
123161次浏览
1069人参与
#
通信和硬件还有转码的必要吗
#
57294次浏览
526人参与
#
24届的你们都什么时候入职?
#
59987次浏览
424人参与
#
面试被问期望薪资时该如何回答
#
256030次浏览
1479人参与
#
实习,不懂就问
#
42125次浏览
645人参与
#
你们公司几号发工资
#
20557次浏览
139人参与
#
软开人,秋招你打算投哪些公司呢
#
102478次浏览
958人参与
#
每个月的工资都是怎么分配的?
#
25291次浏览
409人参与
#
如果你有一天可以担任公司的CEO,你会做哪三件事?
#
29025次浏览
460人参与
#
你觉得现在还能进互联网吗?
#
7596次浏览
130人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务