首页 > 编程语言 >算法竞赛复健记录

算法竞赛复健记录

时间:2024-07-18 20:41:29浏览次数:15  
标签:复健 le 线段 BFS 算法 竞赛 复杂度 land

高三学了一年文化课感觉已经不会算法竞赛了,开个博客记录一下复健历程。

CF1662F

题意:有 \(n \le 200000\) 个点,每个点有能量 \(p_i\),消息能从 \(i\) 传到 \(j\) 当且仅当 \(|i - j| \le \min(p_i, p_j)\),求消息从 \(a\) 点传到 \(b\) 点至少需要经过几个点。

考虑把点按 \(p_i\) 降序依次插入某个数据结构 \(S\)。当 \(i\) 要插入的时候,将 \(i\) 和 \(\{j \mid j \in S \land i - p_i \le j \le i + p_i\}\) 里的点连边。这里选择可持久化线段树作为 \(S\),用线段树优化建图的方式连边。时空复杂度是 \(O(n \log n)\),但是由于实现得不好 MLE 了。

题解的一种做法比较巧妙,直接用线段树优化了 BFS 的过程。本题相当于每条边长度是 1,所以 BFS 时让每个点只访问一遍就可以保证正确性和时间复杂度。对当前 BFS 到的点 \(i\),它能走到 \(j\) 当且仅当 \(j \in [i - p_i, i) \land i \le j + p_j\),或者 \(j \in (i, i + p_i] \land i \ge j - p_j\)。对前一情况,用一个支持单点修改、查询区间最大值的线段树 \(S\),令每个 \(S_j = j + p_j\),当从 \(i\) 能走到 \(j\) 时,即 \(S.\max[i - p_i, i) \ge i\),就把 \(j = S.\operatorname{argmax}[i - p_i, i)\) 从线段树里删去,并将 \(j\) 加入 BFS 的队列。后一情况同理。这样的时间复杂度是 \(O(n \log n)\),空间复杂度是 \(O(n)\),常数也小,不会 MLE。

标签:复健,le,线段,BFS,算法,竞赛,复杂度,land
From: https://www.cnblogs.com/0x1B/p/18309659/returning

相关文章

  • 杂谈:Vue 的 Diff 算法
    Vue.js使用虚拟DOM来高效地更新用户界面,其中的Diff算法是关键。Diff算法负责找出新旧虚拟DOM之间的差异,并高效地更新实际DOM。本文将详细解析Vue的Diff算法的工作原理和在实际开发中的应用。1.什么是虚拟DOM虚拟DOM是一个轻量级的JavaScript对象,用于描述DOM......
  • 密钥算法测试
    1.RASpropertiesimporthuksfrom'@ohos.security.huks';functionGetRSA4096GenerateProperties():Array<huks.HuksParam>{return[{tag:huks.HuksTag.HUKS_TAG_ALGORITHM,value:huks.HuksKeyAlg.HUKS_ALG_RSA},{tag:huks.H......
  • 对抗类比赛评委计分算法
    节得分算法s1:每节比赛结束,评委二选一投票,票数和,为选手的节得分。节得分算法s2:每节比赛结束,评委二选一投票,票数多的,选手的节得分为:2分,票数少的,选手节得分为0分;两个票数一样的,各得1分。节得分算法s3:每节比赛结束,评委给2个选手打分,选手的节得分为评委得分之和。节得分算法s4:......
  • 【算法】JZ30 包含min函数的栈
    1.概述描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数,输入操作时保证pop、top和min函数操作时,栈中一定有元素。此栈包含的方法有:push(value):将value压入栈中pop():弹出栈顶元素top():获取栈顶元素min():获取栈中最小元素......
  • 【算法】删除有序链表中的重复元素、保留重复节点的一个
    1.概述存在一个按升序排列的链表,给你这个链表的头节点head,请你删除所有重复的元素,使每个元素只出现一次。返回同样按升序排列的结果链表。本问题和【算法】删除有序链表中的重复元素、不保留重复节点很类似,但是思考起来稍微简单些,建议看完这个,看链接的这个吧。2.......
  • (新)app逆向四(常见加密算法)
    加密的分类1、单向加密:MD5、sha系列不可逆2、对称加密:AES、DES3、非对称加密:RSA、DSA4、补充算法:base641.md5importhashlibm=hashlib.md5()m.update('helloworld'.encode("utf8"))print(m.hexdigest())2.shaimporthashlibsha1=hashlib.sha1()data='hellow......
  • 基于Python语言的入门算法和数据结构(持续更新中,求关注一波)[链表 栈 队列 复杂度 操作]
    这篇文章主要是讲的Python语言的算法,本人还在不断记笔记中,文章也会持续更新,内容比较浅薄,请大家指教另外推荐一个比较好用的记笔记的软件Typora,自己已经使用很久了,感觉不错。。。虽然但是还是有欠缺。目录第一章算法概述1.1什么是数据结构?01数据结构都有哪些组成方式02......
  • 代码随想录算法训练营Day13 | 二叉树理论基础 二叉树的递归遍历 前序、中序、后序遍历
    一、二叉树理论基础1. 二叉树种类①满二叉树:顾名思义就是结点都满的二叉树。定义:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。     深度为k,结点数为2^k-1的二叉树②完全二叉树:最后一层可以不满,但最后一层从左......
  • (7-2-03)RRT算法:RRT算法的定义与实现(3)RRT_Connect 算法
    7.2.4 RRT_Connect算法RRT-Connect算法是RRT(Rapidly-exploringRandomTree)算法的一种变体,用于解决路径规划问题。与标准的RRT算法不同,RRT-Connect算法旨在通过两个相互连接的RRT树来更快地找到起始点和目标点之间的路径。上述的RRT每次搜索都只有从初始状态点生......
  • 代码随想录算法训练营第二天| 977 有序数组平方 209 长度最小子数组 59 螺旋矩阵
    977有序数组平方funcsortedSquares(nums[]int)[]int{ //思路,最简单,先平方,再排序 foridx,num:=rangenums{ nums[idx]=num*num } //插排思想,维护两个列表,将无序列表元素插入到有序列表合适位置 fori:=1;i<len(nums);i++{//此处nums[:i]即我们维......