- 博客(50)
- 收藏
- 关注
原创 1.8、数位DP(算法提高课)
求给定区间【a,b】中的不降数的个数,不降数的定义为从左到右各位数字成小于等于的关系。:首先预处理出来f[i][j]为一共有i位,且最高位为j的数的个数,然后用数位dp求解即可,具体看代码。
2024-04-19 21:12:20
329
原创 Codeforces Round 935 (Div. 3)F(贪心)G(模拟)
可以用对顶堆来做,一个大根堆维护将要采集的蘑菇,一个小根堆维护已经采集的蘑菇,每次采集蘑菇都看一下当前蘑菇魔力值会不会变成0即可,无论在哪一个堆的蘑菇的魔力值变成0,都将这个蘑菇弹出堆。分钟结束时回到队列中排队,同时每名学生都有一个优先值,当他回到队列的时候,他会站到第一个大于等于他的优先值的同学后面,也就是他会插队,如果有几个同学同时返回队列,他们会按。的蘑菇的魔力值都会变成0,你不会拿魔力值为0 的蘑菇,问最多能采集多少价值,且在最大价值的前提下找到采集蘑菇数量最小的一种方式。
2024-03-20 15:02:43
604
原创 Codeforces Round 933 (Div. 3)(F-G)(单调队列优化DP、二分+思维、01bfs求最短路)
我们可以为每个颜色建立一个虚拟节点,对于这个颜色连接的所有点,都连一条指向虚拟节点边权为1的有向边,然后从这个虚拟节点向这个颜色的所有点都连一条边权为0的所有边,这样就可以表示在一条地铁线上走不需要花费费用,因为边权只有0和1,我们就可以用01bfs,即双端队列bfs求最短路,就可以得到从起点到终点的最短路了。:这道题很明显的用单调队列优化dp,跟滑动窗口一样,用单调队列优化dp求出每一行建桥的代价后,再对列求一遍前缀和,找出最小子段和即可。,对于支架的要求是,在桥的两端必须要建支架,即。
2024-03-12 19:44:03
819
原创 Codeforces Round 928 (Div. 4)( F(dfs+小技巧),G(树上dp) )
一定是会超时的,因此我们看如何优化,会发现,坐标和为奇数与偶数的格子是互不影响的,也就是所有可能的X形状的格子,要么坐标和全是奇数,要么全是偶数,即下图中,X形状的格子要么全是蓝色,要么全是棕色。给定一棵树,树上的点要么是P,要么是S,要么是C,C可以替换成P,也可以替换成C,要求在树中加一些墙,使得任意的P跟S之间都是有墙的。如果这个题没有C的话,我们可以用并查集缩点然后建图,统计每个S点的度数即可。的网格,网格上的点不是黑色就是白色,要求修改最少的点,使得网格中没有X形状的黑色网格。
2024-02-21 00:10:42
2087
原创 牛客小白月赛87 G(快速求出一个数组中gcd==1的的逆序对个数)
为1,求逆序对很好求,我们都知道可以用树状数组求,那么如何快速求出来一个数组中互质的个数呢?注:一个长为n的排列即为在这个数组中,1~n每个数恰好出现一次。的倍数,我们统计这些数中逆序对的个数,但是我们会发现一个问题,:给定一个长度为n的排列,想知道排列中有多少个数满足。:首先题目翻译过来就是,问一个排列中有多少个逆序对的。中,然后用树状数组求一遍逆序对的数量,例如,假设。都是计算过的,因此最后的答案就是。的倍数,任意选择两个数,他们的。的逆序对个数,我们可以倒叙枚举。的个数,这样得到的就是。
2024-02-16 23:55:45
715
原创 CF 1879D (位运算)
的前缀异或和为1,那么就要找到前缀中所有异或和为0的位置,并且求出它们的区间长度,我们已经知道了前缀中0的个数cnt,我们只需统计下来所有为0的位置的下标总和sum,那么需要求的区间总长度就是。因此我们要看看有没有其他的办法,因为用到了异或运算,因此我们可以考虑是否可以用位运算来做,会发现,对于一个二进制数的每一位对答案的贡献都是独立的.的二进制长度最长为30,那么我们就可以看成是30个长度为n的二进制串,问题就转换成了:给定一个01串,对于所有包含奇数个1的区间。,计算它们的总区间长度。
2024-02-15 15:34:57
572
原创 Codeforces Round 923 (Div. 3)F
因为要求最小边权,我们可以想到要用kruskal算法,首先将所有边权从大到小的顺序排序,然后按边权从大到小建立图,用并查集来判断环,因为是从大到小遍历边权,因此如果第一次遍历到两个节点在一个集合中,这条边就是所在环的最小边权,然后就可以找到最小的环的边权,同时记录下来最小边权的两个节点,再跑一边dfs找到换上的节点即可。:给定一个n个点,m条边的无向图,图不一定连通,要求找到图中的一个环,该环上的最小边权比图中所有环的边权要小,输出这个最小边权,所在的环上的节点数量以及按顺序输出所在的环上的所有节点。
2024-02-14 20:27:36
234
原创 Codeforces Round 756 (Div. 3)(E2,F)
求一遍前缀和,前缀和中是可能出现负数的,此时枚举左边界,右边界不存在单调性,因此我们不能二分来查找右边界,这个时候我们可以用st表预处理出来任意一段前缀和中的最小值,然后我们二分的。条边的树,一个人在1号点,他的朋友们在其他点,每过一秒,每个人都可以移动一步,问这个人在走到任意叶子节点的过程中是否能不被抓住,如果不能,那么找到至少需要几个朋友在树上。该点距离最近的朋友的距离,因为是一棵树,因此从1号点到任意的叶子节点都只会有一条路,所以对于从1号点到任意叶子节点的路径中,如果存在。首先,我们对于原序列。
2024-02-04 21:34:35
603
原创 Codeforces Round 764 (Div. 3)E G
个字符串中所有长度为2,3的子串,这里有一个小技巧,记录长度为2,3的子串时,我们可以像哈希一样将其看成一个10进制数,然后就可以用一个数来表示一个子串,然后我们用。我们可以从高位向低位枚举,去掉该位为1的边后,图是否能连通,如果能连通,那么这一位就不在答案中,否则这一位就在答案中。任何字符串都可以用长度为2,3的子串拼起来,因此我们记录下来给定的。个字符串中,问应该如何分割,答案输出分割出来的每一段在。分割成长度大于等于2的一些子串,且这些子串在给定的。条边,求所有权值按位或的最小生成树。
2024-01-26 18:09:32
233
原创 Codeforces1660 F2. Promising String (hard version) (思维+树状数组+小技巧)
的数量相等,我们就称为是平衡的字符串,如果能通过以下操作使得字符串变成平衡,我们就说该字符串是有希望的,平衡的字符串一定有希望。问一个字符串有多少子串是有希望的?因为用树状数组求比一个数小的个数不能出现负数,前缀和中可能会出现负数,因此我们首先计算出前缀和的最小值。是连续出现的,如果不是连续出现的,其前缀和是不会达到3的。如果不把0加入到树状数组中去的话,那么会漏掉第一次出现3的情况。为了满足这两个不等式,我们可以用三个树状数组分别维护。:给定一个字符串,字符串只包括。的值,然后用树状数组求比。
2024-01-24 21:46:06
863
原创 Codeforces1689C - Infected Tree(树形DP)
给定一棵树,除根节点的度数最多为2,其他节点的度数最多为3。有一个病毒从根节点开始向下蔓延,每次病毒会向其下一层的所有子节点蔓延,同时每次我们可以选择删除一个节点,那么以该节点为根的所有子节点就被救下来不会被感染了(不包括删去的节点)。问最多能救下来多少节点。被感染,能救下来的子节点的个数。因为除根节点外的其他节点的度数最多为3,那么每个节点最多有2个子节点,对于每个节点我们每次会选取其中一个子节点删除,用。:简单的树形DP,我们可以用。的两个子节点,那么删除。为根的子节点的个数,
2024-01-23 17:08:39
1042
原创 Codeforces Round 920 (Div. 3)
每一次白色棋子会向下走一步,黑色棋子会向上走一步,因此,我们只需要判断两棋子相遇前的最后一步是谁走的,然后再判断每个棋子应该往哪个方向一直走,例如,最后一步是白色棋子走,那么白色棋子就是白色棋子往黑色棋子的方向走,如果最后一步是黑色棋子走,那么就是黑色棋子向白色棋子的方向走,另一个棋子与之相同的方向走。的网格中,放入一个黑色棋子与白色棋子,每一次,白色棋子可以选择向正下方,左下,右下,三个方向移动棋子,黑色棋子每次可以选择正上方,左上,右上三个方向移动棋子。数组中的第一项,如果不是,所有的权值都要减小。
2024-01-22 19:10:13
964
原创 Codeforces Round 916 (Div. 3)(G未补)
题意:A任务需要一分钟完成,B任务需要两分钟完成,……以此类推,给定一串任务s,由大写英文字母组成, 第i个字符表示完成了s【i】,问能完成多少个任务思路:统计一下每个字符出现的次数,然后根据题意判断一下即可。
2023-12-20 22:23:46
1613
原创 Codeforces Round 797 (Div. 3)
思路:记录下来每个位置a数组和b数组的差值,如果差值为负数,即a[i]<b[i],那么一定不满足题意,对于能减至0的位置打个标记,那么对于没有打标记的位置的差值都相等,对于有标记的位置的差值要大于没有标记的位置的差值,否则不满足题意。题意:对于给定的数组a,和q个操作,每次操作将a中的某个位置k减小d,要求数组中每个数的前一个数要大于等于后一个数,如果当前数大于前一个数,那么就会变成前一个数,问,每次操作后数组中有多少个不同的数。思路:白色的权值为1,黑色为0,求一遍前缀和,然后对于每k段取min即可。
2023-12-14 22:37:22
811
原创 Codeforces Round 805 (Div. 3)
按题意找到比当前数小的最大的10的整数幂的数,然后差值即为答案,我这里写复杂了,用的字符串,记得要考虑前导0。
2023-12-14 15:03:28
770
原创 3.3图论(算法提高课)
目录一,最近公共祖先(lca)1,祖训询问2,距离3,次小生成树4,闇の連鎖二,有向图的强连通分量1,受欢迎的牛2,学校网络3,最大半连通子图4,银河三,无向图的双连通分量1,冗余路径2,电力3,矿场搭建一,最近公共祖先(lca)首先介绍一下什么时最近公共祖先。求lca一般有两种方法,一种是向上标记法(时间复杂度O(N^2),另一种是树上倍增法(时间复杂度O(NlogN)一般来说,用的比较多的就是树上倍增法,因
2023-10-09 13:20:15
116
原创 专题五 并查集(kuangbin专题)
这题很简单,就是一个朴素的并查集,每次进行打开电脑的操作时,我们遍历每一台已开机的电脑,如果有跟他距离小于给定条件的,就将他们加到一个集合中去 ,对于查询两个电脑是否能实现通信,就判断这两台电脑是否在一个集合中。
2023-09-28 22:25:37
83
原创 Codeforces round 900 (Div.3)(G未补)
我们会发现,对于任何一个位置,如果这个位置翻转次数位偶数,等价于没有翻转,如果是奇数,就需要跟以区间中心堆成的点交换位置,例如,如果我们进行了前两次操作,那么得到的结果就是 jghcdegdia,中间的八个字符等于没变,左右端点的两个字符交换了一下位置,因此我们可以得到结论,如果一个位置操作了奇数次,等价于将这个位置和以其所在区间的中心的对称位置交换位置,如果为偶数次,等价于没有操作。给定一个长度为n的序列a和q个询问,每个询问给定一个l,k,要求找到最大的r满足f(l,r)>=k……
2023-09-27 21:57:13
481
3
原创 专题七 线段树(kuangbin专题)(还有扫描线的题待补充)
单点修改 + 区间查询: 1 2 9区间修改 + 区间查询: 3 5 8 10 11 12 13区间染色: 4 6需要合并区间的区间查询: 7扫描线计算面积: 16 15扫描线计算周长: 14扫面线计算体积: 17。
2023-09-25 16:06:34
57
原创 高级数据结构(算法进阶指南)(待补充)
带权并查集+二分判定答案这题要求我们求冲突事件的影响力的尽可能的小,也就是最大值最小,看到这类要求,我们就要考虑是否能用二分判定答案来做,显然这题是可以的,首先我们二分答案,对于所有大于我们二分的结果mid的影响力,我们就将它们加入到一个集合中,然后将其两个罪犯分别关押到两个房间,用不同的边权来表示,如果二者的边权和模2为0,说明这两个罪犯关押在一个房间中,模2为1,说明关押在不同房间中。
2023-09-16 09:16:34
83
原创 Codeforces Round 895 (Div. 3)
那么显而易见,我们需要让前面那部分尽可能大,后面那部分尽可能小,前面那部分的数的个数一共是n/x个,后面那部分的个数一共是n/y个,对于一些下标,它可能即是x的倍速,也是y的倍速,那么它可能会先加上后减去,所以前面那部分的个数和后面那部分的个数要减去这些重合的下标的个数,重合的下标的个数就是x和y的最小公倍数,对于前面那部分,我们就可以从n开始往前选择需要的个数,对于后面那部分,我们就从1开始往后选择需要的个数,这样得到的答案就是最大的。题目大意就是给定一个区间【l,r】,找到两个数a,b满足两个条件。
2023-09-09 21:37:01
147
原创 高级数据结构(算法提高课)
题目链接:https://www.luogu.com.cn/problem/P1455这题是并查集与01背包的一个结合,我们可以将搭配在一起的云朵合并,并且将属于一个集合的云朵的价格和价值都加在该集合的根节点中,在进行一次01背包就可以了得到给定金钱能买到的最大价值了代码如下:2,程序自动分析题目链接:https://www.acwing.com/problem/content/239/这题运用了离散化和并查集,因为数据范围很大,所以我们要先离散化将数据映射到一个小区间上,然后用并查集动态维护,对
2023-09-02 21:46:33
213
原创 KMP算法
一般来说,我们最常见也是最容易想到的就是暴力枚举字符串A中的每个位置i,把字符串B与字符串A的后缀A【i~N】对齐,向后扫描逐一比较B【1】与A【i】,B【2】与A【I+1】……是否相等。我们把这种比较的过程称为A与B尝试进行“匹配”。上述的做法虽然常见,思路简单,但是时间复杂度是很高的,理想情况是O(N+M),但是很容易被卡成O(NM),且理想情况的概率是极小的,所以我们要学习KMP算法,KMP算法可以在O(N+M)的时间复杂度求出上述问题。
2023-08-06 20:38:30
48
原创 基础算法(算法进阶指南)
还有两种情况我们是不用考虑的,就是初始0变0和1变0,这两种情况对我们的答案都不会有变大的帮助,所以就不用管这两种情况了。,所以我们并不用考虑初始的值,只需要判断一下边界条件,在我们选的值要保证小于m就可以了,那这题我们该怎么去分析呢,题目有很多废话,这里就不复制题目过来了,需要的看上面链接,
2023-07-30 11:58:42
207
原创 基本数据结构(算法进阶指南习题)
我们看这个图,假设a点到根节点会经过c点,b点到根节点会经过c点,那么f(a,b)=f(root,a)^f(root,b),我们发现f(root,c)这一段会重复计算两次,那他们异或就是0,所以树上任意两点的异或值就等于这个点到根节点的异或值和另一个点到根节点的异或值,因为我们可以先预处理出来每个点到根节点的异或值,就抽象成了上一个题,题目就变成了任选两个点,找到其最大的异或值。接下来 n−1 行,每行包括三个整数 u,v,w ,表示节点 u 和节点 v 之间有一条边权重为 w。第一行输入一个整数 N。
2023-07-30 11:45:12
146
1
原创 1.基于LIS(最长上升子序列)模型的DP问题(算法提高课)
下面列举的所有题目都是基于LIS(最长上升子序列)衍生出来的题,都可以用LIS或LIS加上其他算法结合求解题目意思大概就是,求任意一点的左边到这个点的最长上升子序列,和从这个点向右的最长下降子序列,找到其中之一的最大值,对于从这个点往右的最长下降子序列,我们就可以看成是从右往左到这个点的的最长上升子序列就可以了,可以直接套LIs的模板,可以用朴素做法也可以用二分优化的做法,取决于数据范围大小,不会LIS的可以先去看看我的另一篇文章https://blog.csdn.net/m0_74911187/artic
2023-07-27 10:56:00
149
1
原创 树的直径 AcWing 1207. 大臣的旅费
聪明的J发现,如果不在某个城市停下来修整,在连续行进过程中,他所花的路费与他已走过的距离有关,在走第x千米到第x+1千米这一千米中(x是整数),他花费的路费是x+10这么多。我们以任意一点开始,找到离这个点最远的点,然后用找到的这个点,以找到的这个点为起点再进行上述操作,得到的一条路径就是树的直径。为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首都直接或者通过其他大城市间接到达。同时,如果不重复经过大城市,从首都到达每个大城市的方案都是唯一的。
2023-07-26 19:58:59
66
1
原创 贪心汇总
解题思路,将所有区间按左端点从小到大排序,从前往后依次枚举每个区间,在所有能覆盖start的区间中选择右端点最大的区间,然后将start更新成右端点的最大值。给定N个区间[ai,bi],以及一个线段区间【s,t】,选择尽可能少的区间完全覆盖线段区间【s,t】,输出最少选择区间的数量,如果不能实现则输出-1。假定每个果子重量都为 1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使达达耗费的体力最少,并输出这个最小的体力耗费值。输入包括两行,第一行是一个整数 n,表示果子的种类数。
2023-07-25 20:35:34
41
原创 DP汇总
用一个二维数组dp[i][j] 表示从顶点走到第 i 行第 j 列的值的集合,集合属性为最大值,可以发现dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])题目可能出现某个位置上是负数的情况,所以首先要初始化为负无穷代码如下:时间复杂度O(N^2)二,最长上升子序列1,朴素解法时间复杂度为O(N^2) 以一个一维数据dp[i]表示以 i 结尾的最长上升子序列的集合,集合属性为最大值如果i的前一个数j小于i,那么dp[i]=max(dp[j]+1)代码如下:2,用
2023-07-24 11:43:10
118
原创 背包问题汇总
有 N件物品和一个容量是 V的背包。每件物品只能使用一次。第 i 件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。
2023-07-23 08:29:49
329
原创 数论汇总
3,线性筛法求质数 时间复杂度几乎为O(N)1,试除法判定质数 时间复杂度O(sqrt(N))2.分解质因数 时间复杂度O(sqrt(N))
2023-07-20 11:20:20
252
原创 最短路的相关算法
dijkstra算法是基于贪心的思想,从源点开始,我们每次选取距离源点最近点,然后以这个点去更新接下来的点,直至全部点都更新完,初始时要将每个点距离源点的距离初始化为极大值,最后如果还为极大值表示从源点无法走到这个点。对于朴素算法,我们要得到每个点距离源点的最近距离,要遍历全部的点,那就是O(N)的时间复杂度,对于这个地方我们就可以进行优化,用堆来存储每个点距离源点的最短距离,想得到最小的点,那就是O(logN)得。用邻接矩阵得方法实现得代码如图;
2023-07-18 21:56:59
163
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人