首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
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:21
中南民族大学 嵌入式软件工程师
9.26华勤嵌入式驱动方向-线下面试
一面技术面20分钟介绍项目项目中用到了驱动,说说驱动怎么写的通信协议选择的是什么,说一下spi项目中的难点,怎么解决的你觉得哪个项目最有成就感,为什么设备树了解吗,说一下ai使用过吗对华勤的了解职业规划是什么,base选择然后和面试官聊了一下中年危机,这个问题,智者见智基本是围绕项目来问,只记得记得这么多,其他忘记了,简历上写的都会就没问题hr面自我介绍,问一下基本的问题,对公司怎么看,对期望的公司有什么要求,期望工资,offer情况,每天面试多不多,哪个项目你最有深刻印象为什么,个人性格,优缺点,期望base等个人感觉还是线下面好,流程快,体验感好,线上面流程复杂
投递华勤技术等公司10个岗位
点赞
评论
收藏
分享
11-05 20:43
360集团_运维开发工程师(准入职员工)
360集团内推,360集团内推码
在360这样的企业里,管理上非常的扁平化,没有严苛的上下级关系,这一点就非常让人舒服。 同时公司也会给员工很多成长和锻炼的机会,比如说定期的各类型专业知识的培训啊,还有很多接触大项目的机会。只要你肯学习和努力,就一定会有收获。 同事之间的关系也比较融洽,没有其他企业的勾心斗角,尔虞我诈,更多的是同事之间的相互支持和帮助,可以让你在工作中充满信心和动力。 而你只要专注自己的本职工作,深入去研究学习,并充分的运用在各个项目中,就一定会有回报。 所以,在这里,我确实学到了很多东西,而这些东西也会在我未来的职业生涯中发挥着重要的作用。 虽然我已经提了离职,但公司还是给我发了去年的年终奖; 周末的团建,...
360集团公司福利 405人发布
点赞
评论
收藏
分享
10-13 16:58
门头沟学院 Java
秋招结束
其实已经摆了一个多月了,其余所有面试均已放弃
孤独的大菠萝ssp到...:
查看图片
点赞
评论
收藏
分享
09-24 13:54
已编辑
辽宁传媒学院 多媒体设计
这样的有希望被大厂看中吗。。
第一次弄简历感觉好难啊,投了一些但也都石沉大海,问问还有什么修改意见啊
妄越Ccc:
你在这拍写真呢?
那些拿到大厂offer的...
点赞
评论
收藏
分享
今天 13:54
门头沟学院 Java
# 今年秋招是回暖还是遇冷?或者是这样? >
打开朋友圈,有人晒offer晒到手软,有人投简历投到心碎。今年的秋招市场,简直比过山车还刺激——你以为在回暖,转头就遇冷;刚感觉遇冷,突然又回暖了! 同一个就业市场,为什么感受如此不同?是有些人特别幸运,还是有些人特别惨?今天咱们就来聊聊这个魔幻的秋招季。 我认为总体还是越来越难有面试机会了,毕竟环境正在逐渐恶化中! 一、"冷热不均"的秋招现场 学历的差距越来严重,尤其在双非同学之中,只要没 ACM 等竞赛的奖牌或者中大厂实习经历,基本是个位数面试,甚至大多数0面试,参加了几十个测评、笔试、AI 面试,然后最终全部进入人才库! 学霸们的春天,学渣们的寒冬 985大佬们:...
今年秋招是回暖还是遇冷
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
数字马力一面(已挂)
2960
2
...
那个敢跟leader对线的实习生,现在怎样了
2882
3
...
27找实习,简历求拷打
1899
4
...
实习才知道原来攒钱这么不容易(给新人小白)
1693
5
...
转测开是我大学生涯做过最正确的选择
1693
6
...
数字马力 一面
1690
7
...
字节业务中台后端开发一面
1677
8
...
中兴逼签要接吗?最纠结的一集
1555
9
...
数字马力一面
1467
10
...
面试官你是来骗方案了吧?休想
1369
创作者周榜
更多
正在热议
更多
#
同bg的你秋招战况如何?
#
173487次浏览
1016人参与
#
2022毕业即失业取暖地
#
115713次浏览
702人参与
#
京东开奖
#
466625次浏览
2662人参与
#
你实习是赚钱了还是亏钱了?
#
28943次浏览
236人参与
#
CVTE求职进展汇总
#
22472次浏览
319人参与
#
用一句话形容你的团队氛围
#
17618次浏览
176人参与
#
联影求职进展汇总
#
50630次浏览
322人参与
#
哪些公司校招卡第一学历
#
219594次浏览
775人参与
#
牛客租房专区
#
122217次浏览
1347人参与
#
嵌入式岗知多少
#
58179次浏览
548人参与
#
联影医疗求职进展汇总
#
5374次浏览
24人参与
#
毕业论文进行时
#
6056次浏览
80人参与
#
机械人与华为的爱恨情仇
#
136704次浏览
1011人参与
#
58同城求职进展汇总
#
39639次浏览
263人参与
#
我来点评面试官
#
15594次浏览
110人参与
#
找实习你看重大厂光环还是业务方向
#
40992次浏览
163人参与
#
面对逼签的应对技巧
#
6336次浏览
33人参与
#
扒一扒那些奇葩实习经历
#
126121次浏览
1097人参与
#
今年秋招是回暖还是遇冷
#
29681次浏览
187人参与
#
腾讯音乐求职进展汇总
#
135463次浏览
1004人参与
#
实习返校后,你的精神状态是__?
#
36877次浏览
153人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务