自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Educational Codeforces Round 21 G. Anthem of Berland(DP+KMP)

比较简单的想法就是考虑当前位置放和不放一整串。那么直接暴力匹配即可,考虑当前如果不能放。但是显然这不能考虑到所有的情况,比如当。,但是其前面显然没有办法放下一个串。所以我们还要考虑增加一个辅助数组。数组来优化这个寻找可以从哪个。转移而来,或者直接放下一个串。时,我们可以利用前面放下的。开始转移的前提是,这个位置。那么此时转移就是考虑要不要从。直接当通配符暴力匹配即可。出现的次数最大值为多少。转移而来,发现这是一个。,因而这个转移是不合法的。个字符中任意一个字符。,现在要你求出在所有。

2024-09-25 18:31:05 658

原创 Educational Codeforces Round 20 F. Coprime Subsequences(DP+容斥)

中包含了若干个信息,那么我们从只包含自身的信息(即最尾部的信息)倒着开始做减法不就好了吗?子序列的问题,我们只需要知道某个数字有和没有就好了。的信息,那么我们直接考虑减去这些信息就好了。的倍数,我们一定只能从这些数字中选。的倍数方案数,考虑一下这个怎么求。不理解这一步的可以思考一下如下的数列。就知道了,但显然我们要求的不是。考虑将每个数字装入桶。

2024-09-25 17:55:41 791

原创 2024牛客暑期多校训练营7 D.Interval Selection(异或哈希+双指针)

中的每个数字都参与了异或两次,不过这个数列要足够散乱以保证错误率达到一个极低的概率便可认为无错。这个子数组为答案,因此不会影响结果计算,只需要保证正确性即可。题解给出了线段树做法,没怎么看懂,这里给出一个更方便的异或哈希做法。我们知道一个数字异或两次可以归零,那么我们按照如下方法将每个。内的连续子数组为好的,当且仅当这个子数组内的所有元素。是合法的,因为其修改后的数组的值异或为。,其实只要保证我们双指针移动的同时保证。这几个区间是好的,因为每个元素。,我们可以做类似这样的操作。但是值得注意的是当合法区间。

2024-08-26 21:45:03 801

原创 2024牛客暑期多校训练营1 D.XOR of Suffix Sums(思维+二进制)

每次操作即删除末尾若干个整数,再加入一个整数,删除操作肯定是添加操作量级的,这个好做,考虑如何求得答案。范围内的数字个数的和,还要支持加删改,显然这里树状数组是最方便的。操作完之后,回答对于所有后缀和的异或值为多少。,此时询问的细节要注意一下变成询问区间。考虑异或最基础的求答案方法,某个位上。细节挺多的,写的时候注意一些即可。个数字,在向末尾加入一个数字。那么问题就转化为找模意义下的。棵树,每棵树询问的复杂度为。那么单次操作的复杂度为。给出一个最初为空的数组。次方的每个位分别统计。那么此时询问的答案即。

2024-08-23 01:38:21 844

原创 LUOGU P2048 [NOI2010] 超级钢琴(贪心+堆)

找到最大这一个操作,显而易见我们可以想到线段树,堆,之类的数据结构操作结合贪心或者。这样做,我们的原本一个区间只会被最多分成两个区间,被分成的区间总数最多就是。,然后再将这两个扔到堆里即可,即我们把原先的合法区间拆成了。要时刻注意注意我们的思路是定下一个找另一个,即定。时,第一个答案肯定是堆顶的答案,我们设堆顶的为。,本质上线段树之类的也行,但是复杂度要多上一个。来找,转化到这题来说,我们可以发现一个细节。怎么做,可以想到的是,做一个前缀和,枚举。,我们的解法都是从这一点出发的。

2024-08-22 22:57:36 871

原创 Codeforces Round 675 (Div. 2) F. Boring Queries(可持久化线段树)

显然我们的线段树开不了那么大空间,这样做空间时间都炸了,但是我们可以进一步分析,比如假设能做到线段树查询区间乘或者区间加这类的操作就好办了。位加入了某种影响后,为了避免对答案的影响,我们应该在前面的某个地方同时消除这个答案的影响,即类似差分在。本题强制在线查询,那么我们直接写可持久化线段树即可,本题消耗空间较大,注意空间大小要足够。的贡献是相乘的,所以本质上我们不用再去开这么多颗线段树了,直接将所有的。开一颗独立的线段树,显然询问的答案就是若干棵的维护不同的。之前的值我们都已经记录完了,那么我们查询。

2024-08-22 17:24:06 576

原创 Codeforces Round 495 (Div. 2) F. Sonya and Bitwise OR(线段树)

那问题来了,我们要怎么高效获取某个区间内哪些位置出现变化从而减少复杂度呢?答案很显然,线段树。考虑进一步挖掘一下性质,我们可以发现或操作是单调递增的,即只要某一个位置从。乍一看好像没什么很好做的方法,先考虑最暴力的做法是怎么做。显然,对右端点的查询,我们做一个二分的优化复杂度可以变成。在这些变化后的位置暴力枚举即可,可知我们最多只会枚举。的,修改直接照常修改即可,复杂度同时也是。我们只需要记录这些存在变化的位置,定下。,可以通过,注意一些细节即可。显然,对每个询问,枚举左端点。,足够好了,但仍然无法通过。

2024-08-17 00:57:43 665

原创 Codeforces Round 429 (Div. 1) D. Destiny(可持久化线段树)

看到出现次数,种类数之类的东西就可以联想到主席树。不过这题有很多写法,随机化,莫队之类的做法,这里讲一下主席树的做法。我们先按照下标构建一颗主席树,维护每个数字出现的次数,这样我们就可以通过相减来获得区间的某个数字的出现次数。在这里我们分析一种最坏的情况,假设我们每次都必须要递归到叶子节点(或刚好递归到叶子节点的上一层)才能返回。注意到我们每次递归的前提是,要满足所有数字出现次数的和大于等于。,如果存在则输出最小的那个数字,否则输出。次独立的查询,因此单次查询最坏复杂度为。这样做的复杂度看似是。

2024-08-11 00:37:00 1018

原创 Educational Codeforces Round 46 (Rated for Div. 2) F. One Occurrence(扫描线思想+可持久化线段树)

维护某个数字出现次数超过两次以上不好维护,那么我们利用扫描线的思想或主席树的思想即可。只出现了一次,输出这个数字(有多个输出任意一个均可),否则输出。反过来说,想要让答案合法,我们只需要知道是否存在某个。具体而言,按照时间轴构建主席树,当前枚举到。次询问,每次询问一个数组区间。显然这样,只要我们的询问的区间。那么做法显而易见,我们对每个。在主席树中改为正无穷,下标。),如果区间内存在某个数字。出现两次及以上当且仅当。维护上一次出现的下标。个版本的主席树上查询。,注意一些细节即可。

2024-08-10 21:21:41 1153

原创 Educational Codeforces Round 32 G. Xor-MST(Brouvka最小生成树+0-1Trie合并)

那么我们要怎么快速的找到完全图的最小值呢?其实没有那么复杂,用类似主席树的思想即可。,我们需要某种方式找到这类两两异或的最小值,显然我们可以用一颗。级别的,我们要去枚举所有边找到一条最小的边,显然不太可能。所在连通块相连的边权最小,此时我们只需要将。个点的完全图,每个点都有一个权值,点。查询完之后,我们就获得了若干个信息,即。(这一步和主席树做差的思想一致,通过。,那么我们单次查询的复杂度为。因为是完全图,因此边的总数为。得到做差后的树后,我们就可将。次,复杂度毫无疑问的是。那么问题来了,图中的边是。

2024-08-04 18:34:43 1051 1

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

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

2024-03-02 12:05:32 909

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

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

2024-03-02 11:12:35 920

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

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

2024-02-26 22:31:36 975

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

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

2024-02-26 18:59:28 1143

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

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

2024-02-26 16:58:33 891

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

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

2024-02-25 16:44:40 874

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

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

2024-02-25 14:55:58 939

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

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

2024-02-25 13:18:25 802

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

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

2024-02-24 19:56:55 1062

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

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

2024-02-24 12:57:00 818

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

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

2024-02-24 02:34:06 914

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

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

2024-02-24 00:43:34 839

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

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

2023-11-10 12:10:19 118

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

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

2023-11-10 01:22:01 128

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

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

2023-09-11 16:08:36 155

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

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

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

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

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

2023-09-03 18:29:59 165

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

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

2023-09-02 16:11:36 85

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

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

2023-09-01 22:24:26 116

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

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

2023-08-31 22:04:20 80

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

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

2023-08-30 21:53:04 86

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

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

2023-08-29 18:08:40 269

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

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

2023-08-29 14:23:52 154

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

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

2023-08-29 13:22:28 56

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

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

2023-08-19 18:45:14 99

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

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

2023-08-17 23:42:00 91

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

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

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

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

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

2023-08-09 17:26:41 179

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

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

2023-08-08 00:38:03 291

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

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

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

空空如也

空空如也

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

TA关注的人

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