首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
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
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
昨天 18:13
已编辑
门头沟学院 算法工程师
拼多多暑期实习笔试分享
免责声明:以下内容是我语音输入,让我的 ChatGPT 总结整理的题解思路,仅做简单复盘分享,可能存在理解偏差。下面先给出四道题 相对标准化的题干描述。如果你只是想练习,可以先只看题干部分,不要往下翻题解。题目一:主播排序给定 N 个直播片段,每个片段包含以下信息:uid:主播编号A:指标 A(越大越好)B:指标 B(越大越好)T:时间(越早越好)index:输入顺序(越早越好)排序规则如下:A 越大越好若 A 相同,则 B 越大越好若 A,B 相同,则 T 越早越好若 A,B,T 都相同,则 index 越小越好现在需要:对于每个主播,只保留其 最优的一个直播片段使用每个主播的最优片段对 主...
笔试
点赞
评论
收藏
分享
03-13 10:38
已编辑
拼多多集团-PDD_服务端研发工程师(准入职员工)
实习第一天,我在群里问:"这个系统QPS多少?"
"你猜。"导师发了个表情包。 我试探性地打出:"1万?" "再猜。" "10万?" 导师直接甩了张监控大盘的截图过来。 我盯着屏幕上跳动的数字,手指在键盘上悬停了三秒—— 峰值QPS:380万。 "这……这是真实业务?"我打字的手都在抖。 "欢迎来到拼多多。"导师回了一句,"明天技术评审,你来讲讲这个模块的容灾方案。" 我愣在工位上,打开了刚分配给我的代码仓库。 三个月后 秋招群里有人发消息:"兄弟们,有没有做过高并发系统的?面试官问我怎么设计一...
点赞
评论
收藏
分享
03-09 15:57
海南热带海洋学院 Java
迷茫的应届生
前辈们好,我是一名热衷于Java后端开发的26应届生,最近一直在投校招和实习的 Java 后端岗位,但简历投出去大多石沉大海。或boss投出去无回复。想请教大家一些实用的投简历/面试技巧,也希望能得到一些建议或者内推机会。我附上了我的简历,非常期待前辈们的指点,无论是简历优化还是求职经验的分享,对我都非常宝贵。谢谢大家!🙏
26届求职交流
点赞
评论
收藏
分享
03-08 15:04
北京邮电大学 Java
求简历拷打
无实习经历,下周准备开始投暑期了,java后端方向,最后再看怎么修改一下
点赞
评论
收藏
分享
03-11 16:04
已编辑
黑龙江大学 Java
做了一个ai项目,面试官追问两小时!
太长不看版:一个面向金融面试的RPA开源项目:基于Skyvern改造,主打三维度权限、高危审批、LLM容错、双Agent,附带简历写法+面试QA+16天开发日志,代码+文档全开源,专治面试没得聊。🌟 核心亮点速览(就三点):业务深度:银行真实权限模型+分级审批+审计留痕技术巧思:Action缓存降本60%、双Agent断点续跑、三层LLM容错面试加成:所有设计决策写在日志里,配套简历/QA手册,让你聊得深👉 项目地址评论区自取,觉得有用给个Star就行~正文开始:做这个项目的起因很简单:我想要一个面试时真正能聊得深的项目。不是那种 CRUD 搭完就结束的 demo,而是一个完整的系统——有...
Musennnn:
项目地址: https://github.com/Musenn/finrpa-enterprise
AI求职实录
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
我想通了很多
9725
2
...
腾讯后台开发一面
4877
3
...
本科四段大厂实习,暑期拿到wxg offer,终成鹅孝子
4261
4
...
面试总结(附面经)
3690
5
...
滴滴一面
3131
6
...
拼多多笔试
2719
7
...
拓竹科技 前端一面
2652
8
...
京东-零售部门后端一面面经
2591
9
...
春招以来最舒服的一场试
2543
10
...
字节一面、二面(横向挂)
2460
创作者周榜
更多
正在热议
更多
#
我的实习日记
#
3690391次浏览
31879人参与
#
滴滴笔试
#
36629次浏览
207人参与
#
你收到了哪些公司的笔试?
#
1187次浏览
10人参与
#
你上一次加班是什么时候?
#
139052次浏览
776人参与
#
你现在的工作,是“成长”还是“消耗”?
#
802次浏览
26人参与
#
实习进度记录
#
1215685次浏览
11802人参与
#
2025,我想......
#
91858次浏览
675人参与
#
金三银四,你的春招进行到哪个阶段了?
#
19121次浏览
259人参与
#
金融银行面经
#
101315次浏览
551人参与
#
在国企工作的人,躺平了吗?
#
405116次浏览
3966人参与
#
美团笔试
#
705980次浏览
4682人参与
#
小米编程考试
#
32646次浏览
154人参与
#
你听到的“最没用”的秋招建议
#
53926次浏览
326人参与
#
AI岗位暴涨12倍,你会转AI赛道吗?
#
6908次浏览
123人参与
#
米哈游笔试
#
561082次浏览
1114人参与
#
秋招报数:你投了多少家公司?
#
157243次浏览
959人参与
#
字节7000实习来了,你投了吗?
#
6383次浏览
33人参与
#
职场上哪些行为很加分?
#
338116次浏览
3749人参与
#
今天你投了哪些公司?
#
198537次浏览
3368人参与
#
vivo笔试
#
13413次浏览
124人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务