自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(43)
  • 收藏
  • 关注

原创 Codeforces Round 782 (Div. 2) E. AND-MEX Walk(思维+并查集)

联通即可,比较简单的一个想法就是,对每个二进制位开一个并查集,然后直接判连通性即可。这一段之间即可,怎么保证?位在路径上是一直出现的 ),那么这一定会使得我们。,只要上面的情况不满足,那么我们的答案就一定会是。假设我们经历了一系列前缀与的情况,最后剩下一个。对于上面所讨论的情况而言,我们最后一定只会只有。给出一个结论:按上面的来说,我们与序列一定是。位,在此基础上我们任选一条边与起来,使得。,现在我们还要走过一系列的点,然后使得。的并查集,和这些边合并起来,再判断。的情况,对于这种情况来说,我们的。

2024-03-02 12:05:32 861

原创 Codeforces Round 611 (Div. 3) F. DIY Garland(思维+构造)

我们开一个按编号排序的小根堆,将所有叶子都保存进去,然后倒序枚举给出的边集,让权值最小的边深度最小的点和权值最小的叶子节点相连,当其子树内的点都连完时,它又成为了叶子节点,扔入小根堆,可知这样可以构造一组合法的解( 因为。考虑怎么构造:注意到一个问题,我们都只会获得深度较小的点,而那些边所连的点一定会有一些深度较大的点不会在输入中出现,而这些点一定是这棵树的叶子节点。一个点在输入中的出现次数一定是它子树中儿子节点的个数,我们先将其较小的子树构造完后再构造它的子树,这样做是最方便的,而且也是有正确性的。

2024-03-02 11:12:35 888

原创 Educational Codeforces Round 160 (Rated for Div. 2) D. Array Collapse(笛卡尔树+DP)

因为每次都是保留一个最小元素,假设我们想要保留某一个元素在最终数组里,那么我们只能删除它两边比它大的元素。选出一个任意长度的子数组(数组中连续的一段),保留其最小的元素,并将其他元素从数组中删去。现在询问你,按上面的方法操作之后,最终可以获得多少个互不相同的数组,答案对。开始,然后跑递归处理每个点作为子树的方案值,回溯过程中。的元素全都删完,这里的删完是指的是除了自己以外的元素。这样,我们就能对每个节点管辖到的左右子树进行分类讨论了。我们发现,每个点都管辖着一个区间,我们可以联想到。区间的元素,而最小值。

2024-02-26 22:31:36 901

原创 Codeforces Round 881 (Div. 3) F2. Omsk Metro (hard version)(倍增+最大子段和)

这样,我们就可以将树的每一条链分段维护,然后对每一段进行如上的信息合并,就能够实时求出。,那么我们可以通过删除最左边或最右边的一些元素,获得所有在区间。对于这一题而言,我们可以用倍增表做到在线加点维护信息,在线询问。路径的最小子段和,以及最大子段和,这是一个典型问题。,要么是左边或者右边其一的最大子段和,要么是左边。注意到我们的信息是自底向上维护的,且询问区间是。的区间的和直接就是左边的和和右边的和相加),要么是左边一整段区间的和再加上右边的。的其中一个的情况,我们询问的答案都是。

2024-02-26 18:59:28 856

原创 Codeforces Round 916 (Div. 3) G2. Light Bulbs (Hard Version) (强连通分量)

这启发我们做一个事情,跑强连通分量,然后缩点,同时记录缩点后的每个强连通分量里有多少个点,缩点完后的图一定是一张。的点必选,且每个点要么是一个强连通分量要么是原图上的点,如果是强连通的点,比如上面的第一个样例。现在希望你选择一些灯泡,并且在一定的顺序操作后,可以使得所有灯泡都被点亮。的点,我们要把它们先删去,否则会影响答案,这里用拓扑排序删点就好了。图,我们想要选择最少的点使得整张图都被点亮,就只用选择那些入度为。作为开始的灯泡也是一样的,我们这样操作能点亮的区间是整个。那么一个点向区间连边呢?

2024-02-26 16:58:33 835

原创 Educational Codeforces Round 160 (Rated for Div. 2) E. Matrix Problem(费用流)

了,那肯定无论如何都不会满足的,但只有这个条件是不够的,而且很容易找出反例,但我们可以先判掉,使得接下来。但是这一题是带操作次数的条件的,我们要最小操作次数,而且矩阵初始值也不是全为。套路的,我们将行和列看成点,行为左部,列为右部,而每个位置。是可以作为选择的,然后反悔我们的删除操作,把这个。的边,这样我们的矩阵就会形成一张天然的二分图。的位置的影响,无论如何我们都要把多余的。不等,那么显然无论如何操作也是不行的。的,我们直接操作就好。加回来即可,这样对我们操作的贡献是为。的位置的影响,如果某个地方的。

2024-02-25 16:44:40 840

原创 Codeforces Round 240 (Div. 1) C. Mashmokh and Reverse Operation(分治+逆序对)

我们将一个区间翻转时,本质上就是将逆序对的值和顺序对的值交换了一下,因为本来逆序的翻转之后就变成顺序的了。归并排序是在排序的过程中同时算出每一层的逆序对,然后相加每层得到的逆序对,从而得到整个原数组的逆序对的。因此,我们先对原数组做一次归并排序,同时记录每一层的逆序对状态,和顺序对状态。的段,然后每段执行一次翻转操作,操作完后输出当前数组的逆序对数量。层往下的所有层逆序对被改变了,即顺序对和逆序对交换了,而其他层。层状态是相同的,只有逆序对和顺序对的角标被改变了。层直接交换顺序对和逆序对的值(第。

2024-02-25 14:55:58 900

原创 Codeforces Round 489 (Div. 2) E. Nastya and King-Shamans(线段树)

的形式,这直接在线段树上是不好维护的,查询也不好查询。线段树维护区间最大值,我们暴力递归每一个区间,如果区间最大值。这样,我们把单点修改变成了区间加的形式,就能动态维护。我们就找到了一个合法答案,这样单次询问的复杂度会是。想想我们不可能成为答案的位置会是什么样的,一定是。的范围,因此我们可能成为答案的位置不会超过。那么考虑一个单点修改造成的影响,假设初值为。,则我们直接跳过这些区间,我们只搜索那些。的值都可能会是我们的答案,且又因为。注意到查询的是一个前缀和的形式,即。的,当搜索到叶子节点时,且。

2024-02-25 13:18:25 769

原创 Codeforces Round 279 (Div. 2) F. Treeland Tour(线段树合并)

比如我们选了绿色子树,和紫色子树拼起来,我们有很多种方法可以选择,但本质上就是从一个子树中选最长上升子序列和另一个子树中选最长下降子序列拼起来。我们要想能将它们拼接起来,前提是最长上升子序列的结尾要比最长下降子序列的开头要小才可以。开的线段树维护的是整颗绿色子树的信息。开的线段树维护的是整颗紫色子树的信息。这样,我们的答案维护完的同时,线段树对整颗子树的信息也维护完了。号点为我们的子树,它们的信息在回溯到。,我们考虑将它的子树和其他子树拼起来。这样,我们也可以不重不漏的统计完答案。比如我们从随便选一个点。

2024-02-24 19:56:55 940

原创 Codeforces Round 330 (Div. 1) D. REQ(线段树+离线)

看起来没有什么很好的做法,但注意到没有修改操作,我们可以把操作全都离线下来。然后就是单点修改,区间查询的线段树维护一下区间积就好了。已经被处理过了,我们只需要考虑处理只包含。而我们知道,我们现在所处理的询问是一定包含。的形式,可知这样不会影响我们最终答案。个质因子执行线段树修改操作,其中。分解质因子,然后再考虑维护。为分别为各个质因子的幂次)的,所以我们要把上次出现。升序排序,同时记录一个。,你要按顺序处理以下。进行质因数分解,得到。表示这是第几次的询问。,它作为答案时肯定是。

2024-02-24 12:57:00 775

原创 Codeforces Round 538 (Div. 2) F - Please, another Queries on Array?(线段树+欧拉函数)

的数组,代表每个质因子的幂次,查询和修改就直接暴力一个个加起来,然后答案按照公式计算即可。进一步考虑,我们发现我们是在标记下传和区间合并中边修改边查询质因子的有无,似乎是没有必要的。(这里忽略了快速幂的复杂度,本质上标记下传时候的复杂度还要加上一个。回到我们最开始暴力的那个思路,我们维护了每个质因子出现的次数,如果。注意到,我们在下传标记和合并标记时候,都只需要分别对每个质因子看。这样,我们下传标记直接乘, 区间合并也直接乘,复杂度变成了。,这样我们维护的区间值才是正确的。了,说明我们的答案已经包含有。

2024-02-24 02:34:06 870

原创 Codeforces Round #FF (Div. 1) C. DZY Loves Fibonacci Numbers(线段树+斐波那契)

我们将负数下标的斐波那契预处理出来,再处理原斐波那契的前缀和就好了。对操作二的处理非常方便,我们只需要子节点的区间值向上合并即可。为父亲节点下传的标记值,即所有未下传操作中。的 影响,要是能把它们分别拆出来就好了。的标记下传和懒标记合并就可以直接做了。但是对操作一的下传处理很不好做。但是斐波那契数列没有负数下标啊?首先看起来就非常像线段树的题。具体而言:线段树维护区间和。分别为左右儿子的区间和。

2024-02-24 00:43:34 784

原创 [做题日记#2] Educational Codeforces Round #10

容易发现我们第一个元素可以放一个最小的,然后根据 大-小-大-小 这样的方式一个个放入数组中,可以发现这样子我们一定会得到一个满足题意的数组。那么我们只需要固定任意一个蚂蚁,然后模拟它走路的过程,撞到之后交换编号,再通过它来计算剩下蚂蚁的编号和位置即可。当一个蚂蚁遇上了另一个蚂蚁(相撞)时,它们就会改变方向(反弹),从顺时针变成逆时针,逆时针变成顺时针。它们有的顺时针走,有的逆时针走,且每秒只走长度为。,对于每个线段覆盖的区间,问你它包含多少个完整的线段。的路径,使得每条边只经过一次,且至少有一条权值为。

2023-11-10 12:10:19 70

原创 [做题日记#1] Educational Codeforces Round #9

这场还挺有意思的?可能大多都是图论题和一些经典的DS,导致补的很舒服吧()

2023-11-10 01:22:01 77

原创 Codeforces Round 123 (Div. 2) E. Building Forest(带权并查集)

这个并查集维护的是点的连通性,以及集合中任意两点之间的距离(注意,这个"距离"并不一定代表着原图两点的距离,根据合并情况的不同,代表的信息会是不一样的),并查集能做到的带权并查集也能做到,带权并查集事实上就是并查集的另一扩展。(首先强调,这里的边并不一定代表着单向边,笔者为了方便标记,图中的这些单向边的意义是指出表示一个点的根节点,而在带权并查集中这些单向边应该是双向边)带权并查集事实上是将一些要维护的信息作为"边权",这些信息构成的内容变成"距离",然后经过合并集合后我们就可以高效的查询集合内的信息了。

2023-09-11 16:08:36 90

原创 个人ACM封装模板(待持续补充)

该篇文章创立旨意在于保存博主个人常用的一些模板,便于在遗忘时回顾查看,或者需要时方便回顾,思考到放在博客里可以反复查看,也更利于有需要的人学习使用,于是该博客就诞生了。该博客的模板由于是博主个人归纳和总结的,所以可能不免会出现一些使用上的问题或者程序内的漏洞,如果存在此类漏洞,可以私信博主进行更改。代码可以任意转载使用,遇到问题也可以私信博主。代码为整合前人模板并将其修改成自使用版本,不保证均为博主自主钻研。

2023-09-05 23:56:40 386 1

原创 Codeforces Round 872 (Div. 1) B2. LuoTianyi and the Floating Islands (Hard Version)(概率/期望)

才会是好点,增量不同时,我们最后一定会走到其中一个点上,且该点四周的增量都相同,由于图是一棵树,可以证明这个点一定存在的,而。注意到,只有点沿着一条边走的增量相同时才会是好点,那么显然我们对于一条边来说,如果两边的联通分量放的点的个数相同,增量。假设我们在上图的三点在一条链上进行讨论,假设我们不选择三角符号标记的点。我们可以推出一个结论,当我们沿着边走的增量均相同时,我们的点。这个位置而言,我们此时如果往左边走,左边的点的个数为。首先,由于点的个数不能被平均分配,对于我们所选的点。下图不在链上的情况同理。

2023-09-03 18:29:59 89

原创 Educational Codeforces Round 148 (Rated for Div. 2) E. Combinatorics Problem(递推/组合数)

看起来十分困难,我们看看能不能转化成递推的形式获得。(按照原题的公式获得) 和一个正整数。我们对相邻两项作差看看会得到什么。当然,这题也可以根据组合数推出来。就能从之前的状态中推出来了。这样,我们开一个二维数组。当然,这里我们直接暴力做。次前缀和会比较方便一些。,你要计算一个长度为。

2023-09-02 16:11:36 35

原创 Codeforces Round 595 (Div. 3) F. Removing Leaves(树形DP)

的思考方式一样,我们把整棵树的问题转化到一棵棵子树中,从而再从子树中的答案转移到自己身上。的前提下,我们是可以选图上绿色的这两个点的,但注意我们的状态设计:所有选中节点中。显然,我们在深度浅的子树中是可以取深度更大的节点的,而不是必须取深度为。现在要你回答在所有选出点集的方案中,选出点的点权之和最大是多少。那么我们选了橙色点后,我们只能选黄色点来进行转移,即。的点的子树中选剩下能选的节点即可。的节点,即我们要在其中一个子节点。节点的子树中,选出一些节点。的距离,所以我们查询的是在。

2023-09-01 22:24:26 60

原创 Codeforces Round 620 (Div. 2) E. 1-Trees and Queries(LCA)

注意,每次的询问是独立的,即这一次询问加上的边不能为下一次询问所使用,且该路径是可以经过重复一条边或一个点多次的。我们是可以重复经过一条边的,也就是说我们是可以在两个点之间重复行走来获得步数。的奇偶性是否相同即可,对于长度不足的部分,可以通过往返来补足。还注意到这是一颗树,在没有加边的条件下,我们只有通过走。那么想到了这一步,这题就好做了,判个奇偶和两点路径与。那么同理,我们只需要求出这两种方法的最短路径长度。的途中往返相邻的两个点一次,使得路径长度变成。假设这一条最短路径长度为。,那么显然,我们可以在。

2023-08-31 22:04:20 47

原创 Educational Codeforces Round 67 (Rated for Div. 2) E. Tree Painting(换根DP)

通过手摸样例我们发现,答案在我们第一步确定第一个黑色节点时就已经固定了,和操作顺序无关,那我们只需要计算选哪一个点作为第一个黑色节点最大即可。作为根节点的答案,对于其他点作为根节点的答案我们还不知道,而枚举所有点的复杂度是。条边的树,最初时所有节点都是白色的,你要进行。这样,我们只需要先算出任意一个点为根的答案。为根时整棵树的大小,那么我们考虑将。考虑怎么计算选点后的权值之和,假设。的值,想想我们要怎么让答案从。作为根的最终答案,那么显然。,这样,我们还能继续算与。的子树对答案的贡献,

2023-08-30 21:53:04 51

原创 2023牛客暑期多校训练营2 B.Link with Railway Company(最大权闭合子图+线段树优化建图)

注意到题目中方案需求构建的铁路线路在树上呈链状形式,我们先把所有边权转化到点权上,考虑用树剖(重链剖分)和线段树维护每一条链,优化边数至。那么题意就变成了,我们可以任意选取一部分的左部点,同时与左部有边相连的的右部点也必须被选取,问你选取的点最大点权和为多少。回到原题来,我们就让方案和该方案所有要修建的铁路连一条正无穷的边,然后源点。条边的树,每个点代表一个城市,每条边可以修建一条铁路,花费为。问你在你任选一些方案修筑铁路后,你能获得的最大价值为多少。的边,那么就代表这一个点(方案)不选,如果割去的边为。

2023-08-29 18:08:40 223

原创 Codeforces Round #665 (Div. 2) F. Reverse and Swap (线段树)

想想我们交换的本质是什么,如果我们交换了,我们本来要跑左儿子,那么我们交换后会跑到右儿子去,如果没交换,那就正常跑左儿子。的次幂,如果我们是用线段树进行维护的话,我们的线段树一定会形成一个满二叉树,树上的每个节点恰好就会代表一个。因为我们每一次是对当前层中的所有节点都执行了一次操作,显然复杂度不对。的区间执行交换操作,想想怎么让线段树维护这个操作。然后你在线段树上手摸一下操作,发现了一个神奇的结论。的线段树节点,交换左右两个儿子就可以了?的区间,那我们是不是可以让代表。的节点要不要交换左右儿子,我们用。

2023-08-29 14:23:52 116

原创 Codeforces Round #656 (Div. 3) F. Removing Leaves(拓扑排序)

时,说明这个节点的叶子节点全部删完了,那么这个节点就会变成一个叶子。我们再让与其连边,且。我们执行这样的操作,最初开始时,先让每个叶子让与其相连的节点的。现在给出这张图,询问你最多能在图中做多少次这样的操作。看到这题第一眼就想到拓扑排序了,根据题意模拟操作即可。数组为这个节点与其相邻的叶子节点数,的所有节点都放入队列里,跑拓扑排序。, 我们则继续放入队列里,然后继续减。跑拓扑序时,我们每次让队头节点的。条边的树,再给出一个正整数。,然后继续让这个叶子节点。减到最后,如果这个节点。为当前节点的度数。

2023-08-29 13:22:28 30

原创 Codeforces Round 891 (Div. 3) G. Counting Graphs(数学/并查集)

在合并时我们只会考虑最小值,而这两条边的选取也只会对这两个集合的合并产生贡献,对其他集合的合并是没有贡献的。的构建方法,我们会贪心地选择一条最小权值的边(如果有多条我们任意选择一条)来把这两个集合合并。假设我们已经将蓝色和红色的两个集合内部合并了,接下来要合并红蓝两个集合成为一个集合。那么,我们固然可以在合并的同时,让两个集合中任意两点之间连边,这些边有。又由于题目有约束,最小生成树必须是原图给出的树,我们每次合并时的最小边。假设我们已经合并了一些集合中的边,现在考虑怎么把两个集合合并起来。

2023-08-19 18:45:14 62

原创 Baltic Olympiad in Informatics 2020, Day 2. B1. Village (Minimum)(思维/贪心)

现在让你构造一个方案,在花费的代价最小的前提下,使得每个点编号都与最初不一样,输出最小花费和每个点交换后的编号。(这种交换方式会使得按次序交换的节点构成一个环,然后环执行一次旋转,显然编号不会回到自身身上)考虑到每个点都要执行一次交换,又因为这是一颗树,我们给每个点的交换都定一个顺序。我们贪心的执行正确性是有保证的,我们直接贪心地交换即可。我们贪心的想:最小的交换代价就是相邻两点之间进行交换。的方式从叶子开始自下而上交换。条边的树,每一条边的长度为。随便选取一个点为根,假设根为。

2023-08-17 23:42:00 47

原创 Codeforces Round #634 (Div. 3) F. Robots on a Grid(基环树+倍增)

那么我们只要看环上在无数次移动后的一个瞬间,每个格子上是否有黑色点来的机器人,选出其中一个能到这个点的即可。先从环入手,假设我们在所有的格子内都放了一个机器人,在无限的行动下,我们所有的机器人一定都会挤到每个基环树的环内。我们发现,由于这个图是一个基环树森林,要使得所有机器人都移动到环内,最差情况下整张图会是一个环,那么只需要让每个机器人都移动。当机器人移动到环内后,我们每次移动所造成的影响只是换了个位置,而没有进行改变,本质上和没有移动的状态是一样的。的网格,每一个格子只会是黑色(用。

2023-08-10 21:52:43 137 1

原创 2023“钉耙编程”中国大学生算法设计超级联赛(7)H. HEX-A-GONE Trails (思维/博弈)

由于我们是先手状态,如果我们当前停下必定会输,则我们会继续向前走,尝试看看有没有必胜策略。我们让两个玩家轮流进行操作,那么对于每一个玩家来说自己都是先手状态:当前状态我们可以沿着链继续向前,也可以停下走链外节点。(不能动的玩家就判负,即玩家要找到一条路径使得这一条路径比另一名玩家所有可选的路径都要长。假设我们停下,开始走链外节点,我们会必胜当且仅当另一名玩家走剩下所有节点时,其能够。除此之外的部分,在不相互影响的条件下,两个点都能走到。一定会在链上相遇,这时我们只能走链外节点,判断。

2023-08-09 17:26:41 118

原创 Codeforces Round 662 (Div. 2) #D. Rarity and New Dress (二维dp / bitset卡常)

那么我们可以先考虑上下方向最大能够扩展的长度,然后再考虑左右方向能够扩展的长度。这是因为我们要向左和向右扩展,前提是我们上下能够扩展。对于构成的一个菱形来说,我们假设其上下左右四个格子的长度为。问:对于给出的网格,总共有多少种不同的方法构成一个菱形。对于一个格子,我们考虑从上下左右四个方向进行转移。,单个格子加周围四个格子构成的一个小菱形来说。的菱形能够构成的前提是其四周可以分成四个。的菱形能够构成的前提是其四周可以分成四个。假设我们进行最暴力的做法,利用做法。的复杂度是过不了的,但我们发现。

2023-08-08 00:38:03 239

原创 Codeforces Round #406 (Div. 1) B. Legacy(最短路+线段树优化建图)

但是即使是这样,还是会有很多建图的问题,每个虚拟节点复用率很低,一个虚拟节点只会与一部分节点相连,虚拟节点数多了之后,效率还不如普通的连边方法。可以发现我们这样建立新图的时,对于已经规定的路径,我们的所有节点都满足原图条件。至于连到哪一棵树的叶子,其实都无所谓,它们本质上就是一个节点,我个人习惯是出树叶子连入树叶子,不过有时候还要根据题意连边。这样子,单点向区间,或者区间向单点连边时候,我们只需要跑一下线段树,找到节点管辖的范围,然后连边就好了。这样子,我们的整个虚拟图,加上虚拟节点都建立好了。

2023-07-24 19:59:40 188 2

原创 Codeforces Round #786 (Div. 3) G. Remove Directed Edges(拓扑排序+DP)

图,我们可以转化成拓扑图,然后从拓扑序小的转移到大的,一定会得到一条最长路满足题意,在这些路径中找出一条最长的即可。,把这一些点考虑进去,是不优的,或者说考虑进来,就会把路径截断。那么这一题就转化为了求一条满足题意的路径,也就是最长路问题。对于某一些只存在一条出度,或者一条入度的点来说,这一条边是一定要被删去的,那么这一个点就不能 走出去。你要进行删除一些边的操作,操作后,要保证每一个点的入度和出度都至少减少了。如果我们提前把这些点放入我们的路径当中,这一些点就会把这一条路径截断,显然不优。

2023-02-08 22:20:43 111

原创 Codeforces Round #787 (Div. 3)(A-F部分题解)

从叶子节点向上回溯,如果遇到之前走过的链就结束,记录这一条链所有遇到过的节点,把经过的点都标记一下。分成最少链看似困难,但是只要保证每条链包含节点最多,也就是每一条都能够尽量长,就可以满足最少的链了。,跑出每个点的前驱是谁,再回溯一下路径,如果当前点已经被回溯过就 break 掉。的时候,我们的最短路程都是固定的(前提是你走的是两点间的最短路,而且没重复经过。条边的树,问最少分成多少个从上到下的链,并输出这些链。,得到每个节点的前驱,就可以得到回溯时的路径了。而且注意到,操作是对当前所有字母都有效的。

2023-02-07 23:08:39 174

原创 ACL Beginner Contest D - Flat Subsequence(线段树+dp)

思考一下如何快速找出这些元素的最大值,想到 RMQ,同时还要支持新。只会变大,或者不变,不可能减小。第一眼看过去,思考的是类似 LIS 的解法,可以很快推出。阈值,导致线段树越界,这个判断一下就好了(还有,线段树如果习惯从。然后区间查询时候,就可以知道所有区间中的最大值是多少了。不用担心,事实上,就算有重复元素,我们用来覆盖原来元素的。的插入和查询功能,直接考虑线段树。,将其存入线段树内,下次直接区间查询就可以了。从左往右,或者从右往左dp,,第三次,表示4的叶子更新上。,第二次操作,对线段树表示。

2023-01-29 20:23:24 98

原创 Educational Codeforces Round 133 (Rated for Div. 2) D. Chip Move (完全背包dp)

(左边代表第几步,上方代表得到的结果,下方代表下标)的倍数,因此全部跳完之后,我们得到的结果就是图中红色标注的方格。解释一下,首先,我们要能跳第。代表当前为第几步)的倍数,将所有能去到的点都。这样,复杂度就被压到了。跳到了范围外了,所以我们不考虑进来。个物品,我们完全可以用之前记录的取了。,得到的结果如下:(用深绿色点标出)个物品的值,加上单个物品的值,即。,得到的结果如下:(用橙色点标出)步的点,继续往后跳。步选择跳跃的时候,我们能跳。的距离(红色为能跳到的地方)的距离,我们就能去到下标。

2023-01-24 15:07:57 298

原创 Codeforces Round #225 (Div. 1) C. Propagating tree (dfs序 + 线段树)

看到对树的子节点进行区间操作,首先想到线段树,对维护树上的信息,可以利用 树剖 或者 dfs序 来建树,然后再维护每一个节点的权值。题目中对于每一个节点加上一个值,他的子节点加上值的相反数,我们可以画出图来观察规律。虽然这样,对于奇数点,可以维护好懒标记,我们可以获取正确的答案,但是对于偶数点呢?想到这一步,这一题也就出了,利用固定加减,如果当前是奇数,就向区间update(,那么当我们对图中偶数点(蓝色的点),要 加上值。),和根节点同为奇数深度的点固定为加上值。,相对于根节点,深度每增大一次,那么。

2023-01-23 19:28:44 92

原创 Codeforces Round #805 (Div. 3) G2. Passable Paths (hard version)(树上LCA)

这题我第一眼想到类似树链剖分的东西,跑一次 bfs 求出点集中深度最大的点,然后以这个点为根再跑一次bfs(类似求树的直径),再分出一堆儿子,再从每儿子的叶子用记忆化dfs回溯一下路径,遇到一个集合中的点就。给出一棵树,给出一个点的集合,问是否能通过一条简单路径(即在树上找一条路径且不重复走一条边)连接所有点。如果都不满足这两个条件,说明该点(x)既不在st -> top的路径,也不在ed -> top的路径。那么显然,如果都在一条链上,我们是可以很容易求的,和 剩下的点来枚举,枚举顺序从深度大向深度小。

2023-01-22 17:52:51 143

原创 Codeforces Round #149 (Div. 2) E. XOR on Segment(拆位线段树)

首先,对区间操作,第一个想到线段树。但是朴素线段树并没办法维护区间异或的值,那怎么办呢?想到这一步之后就是套上树的模板,然后拆分二进制位分别维护就可以了。那么我们能否用线段树来维护某一个位上的异或值呢?那么我们就可以进行一些骚操作。的前四个二进制位为 [ 0, 0,这三个数,如果对它异或上一个。的前四个二进制位为 [ 0,的前四个二进制位为 [ 0,的前四个二进制位为 [ 0,的前四个二进制位为 [ 0,的前四个二进制位为 [ 0,的前四个二进制位为 [ 0,,加上的和就是最终的答案了。

2023-01-19 23:39:57 155

原创 个人ACM模板(待持续补充)

ACM个人常用模板

2023-01-17 22:08:17 2712 2

原创 Codeforces Round #843 (Div. 2) D. Friendly Spiders(虚拟源点建图 + bfs)

事实上我们不用考虑每个点的距离,我们只需要看最后我们还原最短的路径时,那么我们是否可以让他们都连上一个虚拟的点,优化一下他们的路径呢?那么可以考虑他们的最小质因子,发现,,筛除大于这个范围的虚拟源点,剩下的就是我们所需要的正确点数,那么。但是你会发现,这样是不可行的,因为最坏的情况下,你几乎要建。方法,一种是01-BFS,另一种是不考虑距离的做法。如果不考虑虚拟源点的话,建出的图应该是这样的。这样,我们任意两点之间仍然是互通的,,保持原来的距离,更新并放到队头,,这样我们的建图复杂度就得到了优化。

2023-01-13 02:47:04 207

原创 Codeforces Round #693 (Div. 3) G. Moving to the Capital(dfs记忆化 + 0-1bfs)

从点权小的点去到点权大的点,如果这个点去过,那么我们就不用再继续去寻找这个点能够到达的最小距离了,因为我们在之前的搜索中,已经执行了一次搜索,并且将答案记录了下来。的范围很大,对于每一个点来说,都进行一次dfs求出最小,很显然会T, 那么我们换一种思路。事实上,我们可以把每一个点的答案记录下来,下次遇到的时候直接就可以使用了,这样的时间复杂度是。可以发现,我们的每次行动,都会多次经过一次比自己大的点,这些点都被重复计算了很多次。从点权小的点到达点权大的点,但显然这样不会让我们的答案更优,因为我们的。

2023-01-11 16:20:39 74

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除