Spark24June

news/2024/10/6 4:38:22/文章来源:https://www.cnblogs.com/haozexu/p/18288957

Comment on Problems

2024 March (Spark.md)

本部分是从古老文档 Spark.md 里摘录的,其余的部分过于像流水账,就不贴了

原属于三月的部分下午考题

P2573 [SCOI2012] 滑雪

注意到题目是求一个特殊有向图的最小生成树。

考虑 Prim 与 Kruskal 算法的精髓,实际上是考察了所有可能扩大生成树的转移,所选择的最小的一个可以扩大生成树的转移。

无标题.png

让我们考虑直接按照边权选取会发生的事情, 1-4-5 会被选择,实际上,答案应该是 1-5-1 。这是因为,这种算法并没有考虑最下面那个节点的所有可能转移,实际上最下面 1 的那条边是不可以反向使用的,在正常的图里它可以扩大生成树,这个图里不能。所以前面我们这个转移是没有考虑完善的,我们没有考虑所有转移就草率地做出了决策,这就有问题了。所以,MST贪心的正确性,就是在于已经考虑了所有可能转移。

P4516 [JSOI2018] 潜入行动

是一道大背包

但是比较关键的Trick就是要利用子树的大小来限制转移的上下界,背包问题就是合并子树的贡献,跟启发式合并类似的,利用大的不会多的原理保证了合并的复杂度。

P8575 「DTOI-2」星之河

关键思想是把子树限制用DFN的大小关系来表达,然后转换成偏序问题,使用 cdq分治解。

由于DFN序是只有可能包含或者不交的,所以DFN大小的四维偏序可以转换成三维

P2466 [SDOI2008] Sue 的小球

关键技巧是 费用提前计算 。应该在作出当前决策的时候把对后续决策的负面影响计算在当前决策的费用中,避免了难以表出损耗的问题。

以上就是所有的书中对该技巧的解读。

我觉得,其实还不是能不能表的出这个问题,考虑暴力这个问题,在没有加入时间到状态时,你做的所有决策都是一个贪心式的纯考虑当前最优不顾全局最优的一种决策,之后你没办法用这种决策转移,因为它很可能不是全局最优的。把费用提前计算,就相当于加了一个状态,把它压到答案里,相当于是贪心了,把各个状态之间的干扰去掉了,比如我之前这个时间是要影响下一个转移的代价的,现在我先计算了,下一个状态可以看作是基于某个转移之后所在的一个新起点开始转移。对于DP,你子问题要有依赖关系,但是不能有干扰,就是要保证有最优子结构性质。

所以我认为不能叫做提前计算,因为这本来就是这个转移带来的代价,是后续要选择这个转移的代价,是在当前综合了全局的最优决策,这样做保证了有最优子结构性质,所以这个Trick更像贪心(所以这个题加一个时间维应该也是有正确性的)。

P3224 [HNOI2012] 永无乡

FHQTreap+启发式合并

总结两种可以把不可合并数据结构换成可并或者把不可在线数据结构换成在线的方法:

  • 不可并换可并:启发式合并,复杂度多一个log

  • 不可在线换在线:二进制分组

所以我们所说的暴力数据结构,就是在平衡操作次数和数据结构大小,而前者常与这个数据结构的数量有关(这令人想到根号分治),这种通常是元素数量是固定的时候才是对的(想想线段树合并)。

关键就是:

大的不会多,小的不会大

P7150 [USACO20DEC] Stuck in a Rut S

本题是按照“拓扑序”模拟。

这样就不必考虑已经转移的状态再被影响,这就是更新成环的情况。这个就是“无后效性”,其实上面第一题也有这样类似的想法。

P4211 [LNOI2014] LCA

首先把所有的贡献叠在一张图上可以看出答案就是 \(path(i\to root)\cap path(z\to root)\)

在信息可差分的时候,可以通过前缀和避免从数据结构中删除

P8903 [USACO22DEC] Bribing Friends G

这道题的关键在于要发现性质。。。

当问题困难的时候,思考通过枚举答案的方式转换成判断问题或者帮助发现性质。

可以发现如果确定了答案的集合,那么考虑调整答案的集合能否更优,发现答案集合中 \(x\) 较大的如果用了冰淇淋就完全可以把冰淇淋用在 \(x\) 更小的奶牛上面置换出一个mooney,这样既没有改变mooney的总数又节省了一部分冰淇淋,所以就可以推出冰淇淋一定是集中使用在 \(x\) 更小的奶牛上。

P6005 [USACO20JAN] Time is Mooney G

这道题体现了DP与SSSP问题之间的关系。

首先时间肯定是非常重要的一个状态(这点通过思考暴力容易得出),所以如果建成分层图就是分出若干时间层,此时已经可以做了,然后转成DP,也是自然的。

典中典 P2802 回家 和去年没做出来的 P9751 [CSP-J 2023] 旅游巴士

P3899 [湖南集训] 更为厉害

题面amazing啊

线段树合并的做法显然。

用DFN序转化为序列上问题,就得到了一个特殊的三维偏序问题,正如上面“P8575 「DTOI-2」星之河”的第一篇题解所说,DFN序的这种特殊的n维偏序是可以看作n-1维偏序做的。

P7300 [USACO21JAN] No Time to Paint S

本题中有贪心结论如下:

  • 考虑最优方案是将整个区间先全涂上最小的颜色,然后再按照最小颜色分治

  • 考虑证明:

  • 如果不是先涂最小颜色,那么还有操作可以选择:

    • 可以涂更浅颜色,这完全没有用

    • 可以选择涂更深颜色,你不能跨越这些最小颜色的点

      这时候的合法操作集是和上面最优策略操作之后的大小一样的,选择先涂最小颜色,这是具有决策包容性的

    • 可以选择涂这些最小颜色的点,那还不如直接涂一整个区间

    • 证毕

  • 故可以分前后缀来考虑

然鹅之前的 P4170 [CQOI2007] 涂色 ,就是没有颜色深度限制的此题中,就没有这个性质。

这是因为题目的限制不够强,可能的转移决策不止这些,就是说你是可以跨越最小颜色的点,就是不满足了上面的决策包容性。仍然考虑可以节省操作次数的方法,就是要大段地涂上一个颜色把整个区间同一颜色的覆盖,可以发现先给一段区间涂上一个底色是没有影响的,之后答案不会变劣,还会变好,这里就颇有一种DP的感觉,就像上面那个 “P2466 [SDOI2008] Sue 的小球” 中我说的这样,这就是一种状态,做出这个决策之后不影响之后做出的决策,所以又想到DP就是优化搜索的枚举顺序,我可以先涂一个底色然后再进入小区间涂色,这不影响,然后小区间涂色的答案又能够组合成大区间的答案,只要我给他提供所有的可能性,枚举了所有的小区间划分,就行了,还有要注意到无后效性,我最少就只要2个区间就能拼成一个大区间,如果分三个那就可以组合其中任意两个,这就是为什么区间DP里面都是枚举断点。这就是递归地分析。

写不下去了,这个只能自行领会。抱歉用了太多逗号。

P3163 [CQOI2014] 危桥

其实这个交换两个点的方法可以这样理解:

  • 第一次 \(a_1\to b_2\) ,错误的

  • 第二次如果还是乱流,就是 \(b_2\to a_2\) ,那我就可以把第一次乱流的流量通过这条路径送到正确的 \(a_2\) ,这样不就行了吗?你可能会觉得万一路可以走的次数不够呢?那显然把两条路径合成一下就没必要重复走一段路了,就是这样:

P8900 [USACO22DEC] Barn Tree S

简单贪心,显然子树内如果能够自己补充自己那最好,基础的思想就是尽量堆积到一定量之后再移动干草。

P6573 [BalticOI 2017] Toll

可以发现每一次走一步肯定会到达下一层,所以要走几步到达目标层的步数是固定的,走一步是可以到哪里是可以知道的,这种一个大的转移目标可以由若干小的决策步数拼起来的,就可以适用倍增优化,当然,如果空间允许,这个问题也可以在层数上分块 😃

其他有趣的问题:

  • P1973 [NOI2011] NOI 嘉年华 分析见上文

  • P3435 [POI2006] OKR-Periods of Words

    我们应该判断一个前缀的最短Border是否相交,但是KMP求出了最长Border

    我们在此基础上直接跳 Fail,然后记录当前位置的最短Border长度,这样做避免了重复遍历同一个Border,这不禁让人想到去年的提高T2 😦


2024 May/June

还是喜欢这种 All-in 式的东西,之后会考虑若干月之后更换这个文档

P9196 销售基因链

AC自动机、Trie树、二维数点

两个转换:

  • 子树信息可以用 DFN 转化为区间信息,两个区间限制进一步转化为二维数点

  • 把两个字符串拼起来同时匹配前缀后缀(WTF),用 ACAM

警告:少用 std::string 的 + 进行字符串拼接,非常慢(尤其是累加拼接,一定用 +=)

P3181 找相同字符

SA,后缀数组

Md,怎么又是拼接字符串

两个后缀的 lcp(i,j) 等于 \(\min_{x\in(i,j]} height_x\) (就是中间最小值不包括左边端点)

P3868 猜数字

CRT, 中国剩余定理

这个转化很明显。不过要爆 long long 真的不友好。

P5319 [BJOI2019] 奥术神杖

分数规划,二分,AC自动机,动态规划

总结
Observation:看到一对限制A/B,A变大B变小,反之亦然,可以抽象成取物品一样的思路(这道题就是看到乘积变大的代价是多开一次根号),可以考虑推一下看看有没有类似0/1分数规划的二分条件,这题里面,发现有,但是答案可能太大(有次方),可以考虑取对数,相当于把复杂度优化到精度上处理(取多了那你double的处理就需要高精度了,此时时间复杂度变成优化之前的);Warning:本题直接设状态是不满足最优子结构的(问题的最优解不能通过子问题的最优解得来),遇到这种不寻常的方程(非多项式)的时候不要想当然地做
理解
"【理解】对 SPFA 的理解:本题不能直接把操作放上
AC 自动机跑 SPFA,因为实际上可以把 SPFA 看作有环的 DP,Dij则是在特殊情况下用贪心进行的优化,然后有负权,优化失效的原因就是,当前的最优不一定是真最优(因为后面可能有很大的负边权),SPFA 就说,没关系,如果更优我就再进行更新嘛,但是这仅限于边权是求和的操作,如果从当前的最优解(不论它是不是最终的最优解),都不一定可以推到下一个状态的当前最优的话,那DP本身就是不能成立的,因为无法抽离出来子问题,无法用上一个子问题的答案推下一个问题的答案,下次一定要注意对根本的可行性的思考,不能纯套模型"
Trick
这种特殊的限制(此消彼长型),可以考虑二分(其实不管怎么都应该考虑有没有二分性质)| 普通0/1分数规划相当于是一条条向下的直线,这里就是一些反比例曲线,但是只要在定义域(此处为大于1实数)上单调

P3302 [SDOI2013] 森林

可持久化线段树,启发式合并,倍增

LCT 难以维护路径 \(k\) 小值,如果没有连边,这个问题可以考虑使用 树上主席树 。而加上连边,就要考虑维护树上主席树,可以直接暴力重构,考虑用启发式合并思想。有点难写。

P5675 [GZOI2017] 取石子游戏

线性基,动态规划,博弈论,Nim 游戏

动态规划做法比较明显。让我们来欣赏 David_Mercury 的线性基做法。


我们必须清楚地知道,要处理 异或表出的问题,我们有什么方法:异或线性基,01trie,dp

但是如果求方案数,我们往常都会想用 DP。不过,线性基也可以:

以下,令 \(S\subseteq \mathbb N\) 是数集,而 \(P\)\(S\) 的线性基。设 \(\mathbf{consist}(x)\) 是对于 \(x\in S\) ,线性基内的数组成 \(x\) 的集合。

  • \(\forall x\in S\)\(\mathbf{consist}(x)\) 是唯一的,所以要表示 \(x\) ,无论如何都不可能用到线性基里面不在 \(\mathbf{consist}(x)\) 里面的元素

  • 还有的情况就是要选择不在线性基里面的元素,可以选择那些不在 \(P\) 中的元素集合,这个集合的异或和,肯定也可以被线性基唯一表出,我们只需要在此基础上选择一些线性基里面有的元素就可以消除他们的影响,再选一些 \(\mathbf{consist}(x)\) 里面的数就可以凑出 \(x\)

以上两种合起来就是 \(2^{|S-\mathbf{consist(x)}|}\)

这种方法颇需要一些构造性的思维和对线性基的理解,况且该算法较大地优化了复杂度,是一种更为厉害的方法。

P6619 冰火战士

倍增,树状数组

这道题给我们贡献了一个“树状数组上倍增的技巧”

首先答案是单峰函数是很显然的,对于这种函数,如果知道左右两边的解析式,可以把他们做差变成单调函数,然后找零点。

可考虑二分,但是每次二分是 \(\mathcal O(n\log n)\) 的,发现实际上每一次重复遍历的许多点,考虑到树状数组是基于倍增原理优化的,考虑树状数组上倍增(注意必从 0 开始,要不然就不是 lowbit 了)

然后有一个注意点就是 0 点可能不是整数,要考虑从两边逼近 0 点,由于取得是最大的答案,大于 0 那边逼近过后还要往右边再跳,防止右边有一段等值的区间

P9883 Fenwick Tree

思维

这道题其实是基于一种动态规划的思想,考虑树状数组子树内部对它的贡献,如果有直接儿子是 0 ,这棵子树内就不能对根产生影响,如果只有一个是非 0,那么肯定对根产生非 0 的影响,如果有两个以上是非 0,那么他们可以互相取相反数使得可以任意控制对根的影响,所以这种情况下不需要花费额外次数。

CF1083C Max Mex

线段树,ST 表,LCA,思维

线段树不一定非要维护一个序列,只要是可以合并的信息都是可以的。本题的答案显然满足二分性,考虑暴力做,即遇到第一个不可以的点就输出答案,发现如果可以连成链就一定可以,那么就是一个一个往已经确定的路径里面加点,这是好实现的,然后呢??(然后就打开了题解)(假装是自己想出来的)注意到(还敢用注意到)修改的时候其实只会影响一部分路径,如果可以分块处理,把修改的点重新加入旁边没有被修改的块,就可以避免重复创建路径。所以这提示我们路径其实也是可以合并的,这种可以合并的信息,线段树可以通过分块维护它的构成,做到快速修改。

还有就是基于 ST表\(\mathcal O(n)\) 预处理静态 LCA,用 dfn 序把 LCA 问题转换成 RMQ 问题,注意讨论他们在一条链上的情况,可把查询区间变成 \([dfn_x+1,dfn_y]\)

P9695 [GDCPC2023] Traveling in Cells

线段树,二分

技巧是,给每一个颜色开动态开点线段树,一起做线段树上二分。

不过,这个题给我们一种好写的二分方法,就是每一个区间的时候,检查(以二分左端点为例):

  • 这个区间是否能够全部被放进答案里,如果可以,返回左端点,不可以,继续递归

  • 如果右边全部超出范围,直接向左边走

  • 如果两边都没超,先尝试右边,如果右边返回可以继续拓展,再尝试左边

这样为什么是对的:

如果第三步右边向下继续递归了,说明不可能向左边拓展,否则只用检查一层就会返回。

Gym104090B Useful Algorithm

思维,线段树

首先求最大贡献的一位,可以一个一个来处理之后取最大值

现在就是要知道怎么把“会在第 i 位进位”表达出来,发现第 i 位及其之后的位对于这个问题没有贡献,所以考虑到进制就是多项式,可以取模去掉后面的项——处理问题的时候去掉多余的信息总是好的,前面的项相加如果比 \(2^i\) 大就说明要进位。

那么就是要查询 \(\max_{a+b\ge 2_i}\{\max_{c_k=a}d_k+\max_{c_k=b}d_k\}\) 这个不好维护,由于 \(2^i\) 是常量,则可以 移项 变成一个偏序问题。则可以用线段树维护 CDQ 分治完成(自己取的名字)。

Todo: 数据结构还有一些


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/739970.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spark Special_杨宁远 杂题分析.md

Spark Special 图论_杨宁远 杂题分析 Date: 2024-07-03 Preface 本文基于杨宁远 @ynycoding 的课件与题单,对省选/NOIP阶段图论的建模方法和解题策略进行总结,以及本阶段常用方法、模型和 Trick。 A. [AGC056C] 0/1 Balanced [AGC056C] 01 Balanced - 洛谷 | 计算机科学教育新…

按指定日期重复

问题:根据D1指定的日期将A2:C8区域进行重复公式1(姓名)右拉下拉完成 =INDEX(A:A,MOD(ROW(A1)+COUNTA(A:A)-2,COUNTA(A:A)-1)+2) 公式2(日期)下拉完成 =SUBSTITUTE(LEFT(D$1,FIND("-",D$1)-1),".","/")+(ROW(A1)-1)/(COUNTA(A:A)-1) 公式3(…

语法2-运算符、包机制、JavaDoc

语法 运算符 运算符具有优先级-网上查(一般使用括号保证)/-除,%-取余符号-21/10二十一除十取余数,幂运算使用工具类表示Math.pow(2,3)-2的3次方 ++自加,--自减 int a =3 ; int b =a++;//输出a=4,b=3 int b =++a;//输出a=4,b=4==-等于,!=-instanceof-不等于逻辑运算符-与或…

厦门福州七日游

厦门福州七日游2024-06-30 上午被发短信告知航班延误两个半小时。 晚上八点多九点才到了厦门,湘妹 yhp yzf 已经在酒店了。厦门机场不通地铁?????于是打了个车去地铁站。 酒店就在中山路步行街上,有各种店铺。点了一份外卖,和大伙打了一会三国杀,输了几局 2024-07-01 …

SumIf的问题

问题:进销存表数据等于同货号入库表中数据 函数公式解决:=SUMIF(入库!A:A,B3,入库!C:C)

7/8死神永生服周报第七期

1. 死神永生新闻 2. 死神永生服TNT军事基地[三] 3. 死神永生服的古代建筑之自然选择号目录死神永生新闻 死神永生服TNT军事基地[三] 死神永生服的古代建筑之自然选择号这几天又没上死神永生,主要是期末比较繁忙,因此又停了一期。。真的很抱歉。死神永生新闻前一周的治理新闻时…

两个全开源的3D模型素材下载网站源码 3D图纸模型素材 三维图形素材会员下载站源码

今天推荐两个全开源的3D模型素材下载网站源码 3D图纸模型素材 三维图形素材会员下载站源码,这两个源码完整,都是基于thinkphp内核开发的,框架稳定,带数据库,源码文件,可以直接部署使用。第一个:3D模型 图纸模型 机械模型(图纸)下载资源网站源码 thinkphp5开发原创模型(图…

win 10 使用SSH 连接

本教程建议使用win 10 、win 11 非家庭版使用 首先安装 ssh 服务端 Get-Service -Name *ssh* #查看服务ssh -V #查看ssh 版本 netstat -an |findstr :22 # 查看端口是否被监听 ipconfig # 查看本机IP ssh administrator@IP 在用户/.ssh 目录下创建文件 authorized_keys 将…

音视频录制与播放原理

图片来源于网上学习资料,零声学院!

2.基于Containerd运行时搭建Kubernetes多控制平面集群实践-腾讯云开发者社区-腾讯云

https://cloud.tencent.com/developer/article/21298462.基于Containerd运行时搭建Kubernetes多控制平面集群实践发布于 2022-09-29 19:27:531K0 举报文章被收录于专栏:全栈工程师修炼之路[TOC]0x00 前言简述 本章主要讲述,如果使用kubeadm进行安装配置K8S集群,并指定使用co…

【寻迹】二分与三分

二分与三分 二分是一种常用且非常精妙的算法。(英才计划甚至还水了一篇文章)三分法则可以用来解决单峰函数的极值以及相关问题 一、二分 二分法,在一个单调有序的集合或函数中查找一个解,每次均分为左右两部分,判断解在哪一个部分后调整上下界。每次二分都会舍弃一半区间,…

xftp实现linux服务器传输文件

1.xftp下载网址:https://www.xshell.com/zh/free-for-home-school/,下载后下一步安装即可 2.ip addr show查看ip地址,配置xftp连接服务器,找到对应路径传输文件 以上仅供参考,如有疑问,留言联系