![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
洛谷
FrostMonarch
这个作者很懒,什么都没留下…
展开
-
可持久化线段树解释(又叫主席树,可持久化数组)洛谷3919 3402
因为我是菜鸡,如果有说错的话,恳请大佬们指出 QAQ本文分为以下几部分:一:名称的由来二:原理解释三:代码怎么写四:例题名称的由来首先,可持久化线段树,分为:可持久化+线段树。可持久化就是历史信息回顾的意思。比如每次操作我都让某个数改变,那么我想回顾第k次操作,第i个是什么数应该怎么做呢?naive的做法就是我每改变一个数都复制一次这个数组就可以了,但是我们发现其实...原创 2020-02-26 18:21:59 · 316 阅读 · 0 评论 -
洛谷网课第三节
单调栈:单调栈可以用于找出数列中,某一个数它的左边或者右边第一个比它大或者小的数。我们关键是需要维护一个栈,栈中的元素必须是单调的,同时元素的下标也必须是单调的。下标单调很简单,我们只需从左往右或者从右往左扫即可。值的单调性,我们必须每次碰到一个数值的时候,询问栈顶元素,比较栈顶元素,假如不满足单调就弹栈,直到栈为空。例题:leetcode 496class Solution...原创 2020-01-31 16:04:27 · 843 阅读 · 0 评论 -
洛谷 p3078 (差分,贪心)
题目大意:每次可以对区间[l,r]减1,问我们最少经过多少次操作可以把数列an全变为0.解题思路:一开始想用二分加线段树,发现线段树不会写。丢人其实我们只用考虑相邻元素之间的差就可以了,因为假如本个元素比上一个小,那么其实这个元素要减的话,上一个元素已经帮你减掉了。假如本个元素比较大,对答案的贡献就是a[i]-a[i-1]#include <bits/stdc++....原创 2019-12-24 19:59:41 · 672 阅读 · 0 评论 -
洛谷 P1314 聪明的质监员(二分 前缀和)
有两串数wn,vn ,现在有m个区间,同时指定一个W,每个区间会造成cost等于:最后需要求和y现在让我们求一个w 使得|y-s|的值最小。解题思路:首先考虑使用二分枚举w,为什么用二分呢?因为我们发现yi函数是关于w递减的,满足一种单调性。然后我们枚举使得y>=s的最大的w1,再二分枚举y<=s的最小的w2,最后答案要么是w1,要么是w2. 因为他们是极值点中...原创 2019-12-17 21:54:33 · 195 阅读 · 0 评论 -
洛谷 P1083 借教室(二分+差分)
题目大意:有数列An,每次我们可以选择一个区间做减法,问我们第几次操作会导致一个区间出现负数。n<=1e6解题思路:线段树是可以做的,但是貌似这题卡了线段树。这里使用二分枚举答案的方法。为什么这里适合用差分呢?因为这里满足false false ... true ... false的结构。每次枚举到一个点时,我们对指定线段做差分然后用前缀和恢复,最后做到复杂度O(nlogn) 其...原创 2019-12-16 20:23:44 · 184 阅读 · 0 评论 -
洛谷 P1102 A-B数对 (双指针)
题目大意:在An中,我们找出Ai - Aj ==c的所有数对的个数。n<=1e6解题思路:方法很多这里用一个巧妙的双指针完成,这种方法应该是代码量最短的。首先,我们可以对A从小到大进行排序。接着我们枚举指针j,找出Aj - Ai2>=c中的最靠右的位置,同时找出Aj - Ai1<=c中的最靠左的位置,当Aj - Ai1 ==c时,两个的交集的个数就是当前枚举j...原创 2019-12-15 22:21:17 · 443 阅读 · 0 评论 -
洛谷 P1018 乘积最大(区间DP)
题目大意:有一串数字,我们要求出怎么在里面插入乘号,可以使得总乘积最大。解题思路:暴力不可行,这里我们用区间DP,所谓的区间DP就是状态里面包含有区间的端点,然后不断推。这里的转移方程为:for i l->n-1: dp[l][k]=max(dp[l][k],dp[i+1][k-1]*no)其中,dp[l][k]表示左端点在l处时还可以划分为k段的时候最大乘积...原创 2019-12-07 19:48:38 · 258 阅读 · 0 评论 -
洛谷2019秋令营 网课第一节
首先讲了数据的预处理,包括离散化和前缀和的东西。前缀和:洛谷P3406关键差分公式为了使区间[l,r]区间加上1 我们需要: 前缀和公式: ...原创 2019-12-05 15:32:05 · 387 阅读 · 0 评论 -
洛谷 P1566 加等式(计数DP)
题目大意:集合中有若干个元素,若一个元素可以由任意其它元素构成,那么我们得到一个加等式。问我们最多能够得到多少加等式。解题思路:首先我们考虑只使用一维dp[n]是否可做,其中n代表第几个数,发现无法转移。这时候尝试dp[n][m],其中n代表第几个数,m代表走到某一个数后求和为m的总数。dp[i][j] = dp[i - 1][j];if (j == arrmv[i])...原创 2019-11-14 22:01:48 · 330 阅读 · 0 评论 -
洛谷 P3795 钟氏映射(DP推公式)
题目大意:已知有k个数,它们之间可以两两配对或者不配对,一旦有一对配对上了,其它数字都不可以和它们任意一个数字配对。问总共有多少种方案。例如1和2配对了,那么2和3就不应该配对。解题思路:这道题考查了我们对动态规划无后效性的理解。当我们走到第i个数时,我们会想这时候需不需要考虑前面的配对情况。比如在上面的图,我去到第三个了,我想和第二个进行配对,但是万一第二个已经和第一个配对了...原创 2019-11-13 11:49:48 · 150 阅读 · 0 评论 -
洛谷 P5542 Painting the barn(二维差分 模板)
题目大意:小明对着墙壁画矩形,问小明画的矩形里面重叠k次的区域面积是多大。解题思路:首先,我们可以想到对画的一片区域进行+1操作,最后扫描一遍画的区域,若某个点的和为k我们就记录下来。首先,我们可以试一下naive的+1,发现复杂多太高。这时候引入一个新结构叫做二维差分,二维差分再配合二维前缀和就可以达到O(n^2)的更新一片区域。关于二维差分,这里有一个解释:https://...原创 2019-11-11 15:35:16 · 418 阅读 · 0 评论 -
洛谷 P5520 青原樱(组合数学插板法 or 插空法 模板)
题目大意:找出m个两两不相邻的东西在n个坑的放法。解题思路:非常经典的插空法的题目,插空法专门用于两两不相邻的组合数学问题。所谓插空法就是在原有的n个坑里面抽出m个物品,然后在抽出物品之后的坑的缝隙里面塞物品的过程。抽出物品后有n-m个坑,对应有n-m+1个缝隙,往里面插就可以了,公式为:但是这里m个物体是不同的,我们还要乘上m的阶乘。最后公式:废话:模板题,以后遇到组合数学...原创 2019-11-10 14:01:15 · 412 阅读 · 0 评论 -
洛谷 P1114 非常男女(线性结构)
题目大意:一连串的0和1,我们问最长的01个数相等的连续串 最长是多少解题思路:这里用一个结构做一个转换,我们每次遇到0可以让sum-1,遇到一个1可以sum+1。记录下sum在每个位置的值。然后sum值相等的位置例如j和i,让j-i就是答案。但是注意在第0个位置那里,我们让sum=0.废话:+1 -1 这种trick是常用的结构。在括号匹配里面也会经常遇到,需要重点留意#i...原创 2019-11-09 19:45:31 · 256 阅读 · 0 评论 -
洛谷 P1510 精卫填海(滚动数组 记忆化DP)
题目大意:我们可以购买n件物品,每件物品都有重量w和价值v,现在问:已知背包容量为c,那么我们能不能购买物品到达价值V呢,若可以达到我们最少需要多少重量就可以到达呢?解题思路:典型的01背包问题。转移方程为:i是代表我们购买到第i个。c代表我们剩余的容量。m代表本个物品的重量,k代表本个物品的价值。dp[i][c]代表购买到第i个剩余容量为c我们最大可以到达多少价值。最...原创 2019-11-06 17:28:18 · 223 阅读 · 0 评论 -
洛谷 P1113 杂务(拓扑排序,递归)
题目大意:有一个有向无圈图,每个节点看作一个任务,一个任务需要完成必须先完成父亲节点的任务,每个任务都有耗时。假设现在所有不相关任务都可以并行执行,问最短多少时间可以把所有任务完成。解题思路:首先,注意题目中比较坑的点。这里必须是完成所有父亲任务才能完成本个任务,所以某个任务的执行时间是其中par为i的父亲。有这个递推后,我们就要知道怎么完成这个递推,很明显我们这里要按照拓...原创 2019-11-01 15:25:24 · 295 阅读 · 0 评论 -
洛谷 P2577 午餐(贪心排序,DP)
题目大意:已知一群学生分别有独立的排队打饭时间,以及吃饭时间。已知有两个窗口,学生可以在这两个窗口之中的一个排队,学生一旦打完饭就开始吃饭,问怎么安排学生在两个窗口之间排队可以让最后一个吃完饭的学生的时间尽可能的早。解题思路:首先,我们假设只有一个窗口的时候怎么排序是最优的,这里有一个重要的发现就是:当把学生的吃饭时间从大到小排序后再安排学生以这个顺序打饭是最优的。有了这一个重要的发现...原创 2019-10-16 20:27:40 · 197 阅读 · 0 评论 -
洛谷 P1972 HH的项链(树状数组,排序)
题目大意:已知一串数字an,有m个询问,每个询问包含一个区间[a,b],问你an在区间[a,b]中有多少个不同的数。解题思路:我们把每个询问的右区间进行排序,每次我们对树状数组进行更新,怎么更新呢?对于重复出现的数字,我们只记录最后一次出现位置,并在对应位置打1(注意:这里不是对树状数组打1,树状数组本质上是对一个普通数组求和的维护,所以我们这里是对普通数组对应位置打1),之前打过1的...原创 2019-10-16 17:52:00 · 155 阅读 · 0 评论 -
洛谷 P1156 垃圾陷阱(背包DP)
题目大意:有一只牛掉进了井里,然后有一些垃圾会扔进去。每个垃圾都有高度和维持生命的作用,牛可以每次选择堆垃圾或者吃,堆垃圾堆到井的高度即可逃离,或者吃。规定牛有初始寿命10小时,当寿命耗尽结束。同时我们已知垃圾扔进去的时刻。求:最早什么时候可以爬出,若爬不出来问最久能活多久。解题思路:每次可以选择吃垃圾或者堆起来,这有点背包的意思。所以我们可以设定dp[i][j],其中i为第几...原创 2019-09-28 14:55:46 · 187 阅读 · 0 评论 -
洛谷 P1272重建道路 (树形DP)
题目大意:有一棵树,我们去掉任意边,去掉边后剩下的节点的数等于p。问我们最少去掉多少的边。解题思路:这种题目是典型的树形DP,每一个节点有点类似于背包。背包的特点就是:到达某个地方选和不选,这里同样的我们也是到达某个节点后选和不选。怎么选?选什么呢?这题是这样的:dp[u][j]= min (dp[u][j],dp[u][j-k]+dp[v][k])其中:u代表我们到达了树节点u,j代表...原创 2019-10-05 23:35:39 · 212 阅读 · 0 评论 -
洛谷 P1341 无序字母对(欧拉迹)
题目大意:有字母对,问我们允许字母对中字母对调,可以把这串字母首尾相接吗?能够的情况下,问怎么让结果字典序最小。比如,ab cb,我们可以通过对调第二对字母的cb为bc从而得到,ab bc首尾相接。解题思路:我们把字母当作节点,同一个字母对中字母连一条边,然后跑欧拉回路即可。另外这里需要字典序最小,我们在用fluery算法跑欧拉回路时,优先选择排序靠前的节点即可。废话:注意...原创 2019-10-08 23:23:48 · 291 阅读 · 0 评论 -
洛谷 P1169 棋盘制作(悬线法DP)
题目大意:有一个0,1矩阵。求其中的0,1交错的最大子正方形矩阵和长方形矩阵的面积。解题思路:求这种最大子矩阵的题目很可能是悬线法。这个矩阵某个格子[i,j] 向左可能延伸到多远,向右可能延伸到多远,向上可能延伸到多远,然后在确定纵向可以向下延伸时候利用转移公式:up[i][j] = up[i-1][j]+1left[i][j] = max(left[i-1][j].lef...原创 2019-10-09 23:17:01 · 169 阅读 · 0 评论 -
洛谷 P1087 FBI树
题目大意:已知一棵树由字符串组成,规定:若节点全1 把这节点称为I节点。若节点全0 把节点称为B节点。若节点含0同时含1 把节点称为F节点。现在有一个字符串N长,左子树是前一半字符串,右子树是后一半字符串。最小的分解节点为一个字符的字符串。我们保证字符串的长度是2的次幂。求这棵树的后序遍历。解题思路:这种树的遍历题目,我们通过数组的下标传进去dfs来进行树的遍历...原创 2019-08-03 16:09:28 · 129 阅读 · 0 评论 -
洛谷 P1330 封锁阳光大学
题目大意:有一个图,图中有n个点,m条边,我们可以对其中的一些点打标志,被打标志的点会影响邻接所有的边,问为了把所有边都影响,同时最少的打标志的点的点数。同时相邻的点不能打标志。解题思路:一开始以为是贪心,利用最小生成树的思路去做,每次选择度数最大的点,这种解法是错的!其实这题考了偶图,我们只需要按照偶图来进行染色,一个连通分量中我们可以从任意一个点开始染色,然后黑白黑白交叉染,选...原创 2019-09-26 09:43:31 · 86 阅读 · 0 评论 -
洛谷 P1220 关路灯(记忆化DP,区间DP)
题目大意:有n个路灯,每个路灯都有各自的位置ai,以及功率bi,已知小明站在某个c路灯处,小明的步行速率是1m/s,问我们小明怎么关灯使得我们的电量消耗最少。解题思路:首先,我们发现小明关灯肯定是关掉一个区间的灯,毕竟不可能小明路过一个灯不去关它,这是毫无益处的,所以这里我们考虑转换为区间DP,所以可以有状态 [l][r],其中l,r分别表示所在的路灯的编号,这个状态表示在[l][r]...原创 2019-09-24 22:55:13 · 186 阅读 · 0 评论 -
洛谷 P1080 国王游戏(贪心)
题目大意:有一串数字对{ (a1,b1),(a2,b2) } An现在有一个计算分数的算法:第i个人的分数:score[i]=king*An[0][0]*An[1][0]*..A[i-1][0]/A[i][1]。其中,king表示一个初始值,题目给定的。问:我们对An的数对任意排列,怎么得到每次排列中score最大的那个 最小。并输出最优的score解题思路:假设我们只...原创 2019-08-22 12:50:24 · 159 阅读 · 0 评论 -
洛谷 P1135 奇怪的电梯(记忆化DP,回溯)
题目大意:有一个电梯,电梯每层可以上或下Ai层,只要上或者下Ai层是合理的问从A楼层到B楼层最少需要几步。若到达不了则输出-1解题思路:这里有一个难点,就是怎么知道产生了循环比如 1->3->5 然后 5->1,产生了这种循环。所以,我们可以考虑使用回溯。每次走到规定楼层,我们打个标记,以后不能再走。但是这种回溯最后会T,所以我们考虑加入DP,DP的状态[...原创 2019-08-11 15:20:10 · 292 阅读 · 0 评论 -
洛谷 P1020 导弹拦截(递增子串 DP )
题目大意:有一个数列,我们要获取一组子串,这个子串必须单调不增。问:(1)最长 我们可以获取多长的这种子串(2)这个数列中最多有多少种 这种子串解题思路:其中问题一是很典型的DP问题,最大不增子串。关键是第二问,我们要把第二问转一转思路,一种想法是贪心:我们每次都从这个串抽出单调不增子串,看能抽取多少次,但是假如这样抽取的话,可以试一下这个样例:1000 100599...原创 2019-08-10 12:00:58 · 140 阅读 · 0 评论 -
洛谷 P1908 逆序对(堆排)
题目大意:有一个数列,问ai>aj同时i<j的元素对 在这个数列中有多少对解题思路:首先,暴力思路n^2,直接TLE,所以考虑更快的算法。这里我们假设堆排从小到大。在这里我们要使用堆排,为什么使用堆排呢,因为在堆排中,我们假设左右序列都已经排好序了,所以我们再找逆序对的时候,其实减少了重复工作,比如:现在左边序列是 5,6;右边序列是4,7。那么我们的流程是这样的:...原创 2019-08-07 20:41:58 · 258 阅读 · 0 评论 -
洛谷P1803 线段覆盖(贪心)
题目大意:有n个线段,问最多能放多少个不重叠的线段。解题思路:右端点从小到大排序,我们每次尽可能地放右端点小的线段,能放就放(即不重叠)就可以了,为什么这样可行呢?因为右端点比较小更可能留有位置放其它区间。废话:好久没做贪心题了,这种区间题应该能反应过来需要考虑左,右或者区间长度这三个信息,然后再构建算法。另外,所谓贪心,每一步所做的都可以理解为 为最后的全局最优做准备(QAQ...原创 2019-07-28 20:26:57 · 353 阅读 · 0 评论 -
洛谷 P1996 约瑟夫问题
问题简介:小朋友围城一圈,从1号开始报数,报到M的那位同学出局,然后下一位同学报1,循环上述过程直到所有同学出局。输出 依次出局的小朋友的号码解题思路:没什么好说的,就是模拟,出局我们可以不用真的删除,打个标记就行废话:先想清楚什么时候打标记再做,不要急着动手。#include <bits/stdc++.h>using namespace std;in...原创 2019-08-03 12:51:20 · 161 阅读 · 0 评论 -
洛谷 P1057 传球游戏(背包DP)
题目大意:有n个人围成一圈,每个人可以把手上的球传给左边或者右边,现在小明开始传球,问m次后,把球传回给自己的次数。解题思路:考虑DP,使用带记忆的DP,首先我们的状态可以设为[还剩的传球次数][到谁手里了],转移方程为本人拿到的球返回小明的次数=右边那位小朋友拿到的球返回给小明的次数 +右边那位小朋友拿到的球返回给小明的次数#include <bits/stdc+...原创 2019-08-03 11:16:24 · 163 阅读 · 0 评论 -
洛谷 P1088 火星人(乱搞)
题目大意:已知有一串数字,问在原来的数字串的字典序加m后,应该输出多少解题思路:最简便的做法是用next_permutation,这个生成的全排列可以按照字典序递增,这里我用的是搜索的方法。首先我从后往前搜,一直记录最大值,假如遇到比最大值小的数记为A[j],停止搜索,当前,证明我们可以进行一次交换从而达到加一的效果,那么要找哪个数来完成加一呢?我们再进行同样的搜索过程,记录下比A[j...原创 2019-08-03 10:38:07 · 226 阅读 · 0 评论 -
洛谷P1014 Cantor表(二分 找规律)
题目大意:解题思路:额。。打表找规律,不需要真的模拟45°扫描,怎么找就各显各法了,大佬们找到了规律,10行就出来了,作为一名蒟蒻,只是看到了一些等差数列的规律。废话:此题关键是提醒自己二分怎么写,注意边界情况,注意什么情况朝哪边移动。代码(憋看了):#include <iostream>#include <vector>#include &l...原创 2019-07-21 21:19:36 · 224 阅读 · 0 评论 -
洛谷 P1026 统计单词个数(区间DP 暴力)
题目大意:有一个单词串An,可以把单词串分成k份,定义区间单词数如下:已知有一个单词字典如:apple,hi.....在串中的单词数:然后在串中统计有多少个单词,唯一注意的是,若串中某个字母作为单词首字母用了,那么这个串中的字母就不能作为下一个单词的首字母。例如:thise字典中有单词this 和 thise那么这个串中只能有this或者thise,而不能两个单词都存在...原创 2019-08-27 00:28:52 · 205 阅读 · 0 评论 -
洛谷 P1233 木棍加工(贪心,递增子串DP)
题目大意:有矩形A1,A2... ... An. 每个矩形有长宽w,h。现在已知cost:(1)若矩形a的w,h小于矩形b的w,h,那么没有cost(2)其它情况cost+1.现在已知矩形A1,A2... ,问怎么得到最少cost.解题思路:首先,我们要用贪心。这里有一个最优边界,若矩形a1,a2,a3互不包含(即cost肯定有3,之间长宽没有包含关系).所以,最优边界...原创 2019-08-27 17:16:01 · 208 阅读 · 0 评论 -
洛谷 P2279 消防局的设立(贪心)
题目大意:已知有一棵树,我们对它进行一个着色操作,每对其中一个节点着色时候,相邻的距离为2的节点也会同时着色,问我们最少需要的着色次数是多少。解题思路:使用贪心,我们从树的深度从深到浅遍历节点。节点若还未染色,我们则对它的爷爷进行染色。为什么这样染色是可行的呢?因为这样染色我们可以把它,它的兄弟,它的父亲全部进行着色而且还能向外拓展。问题是:怎么知道这个节点染了色没有,我们假若对...原创 2019-09-22 18:45:09 · 131 阅读 · 0 评论 -
洛谷 P1373 小a和uim之逃离(DP)
题目大意:每个人a,u在棋盘上可以向右或者向下走,每走到下一步,每个人有两个魔力值,若原始魔力值为a,这一格的魔力值为b,那么这个人的魔力值就是(a+k)%k,魔力值分别是小a再到小u轮流加。我们规定第一步小a加,第二步小u加。现在问:若最后一步是小u走,且两个人魔力值相同的路径有几个。初始点可以任意选择。解题思路:我们可以使用DP因为,明显地每一步可以由两步转移过来,那现在问题是...原创 2019-09-20 15:16:35 · 142 阅读 · 0 评论 -
洛谷 P1514 引入水域(贪心线段覆盖 DP)
题目大意:在一个n*m棋盘中,我们把源放在第一行,源可以对外进行BFS种子填充,问:为了使得最后一行被填充完毕,我们最少需要在第一行放多少个源。假如最后一行不能被填充,问我们不能填充的个数。解题思路:首先,最后一行不能被填充十分简单,我们只需要在第一行逐列放源,假如最后一行还是有不能被覆盖的点的话,证明不能被填充完毕。现在关键是第一问,最少放几个源。结论1:当我们已知能够完全覆...原创 2019-09-13 19:05:02 · 133 阅读 · 0 评论 -
洛谷 P1120 小木棍(数据加强版)
题目大意:已知我们有若干一样长的木棍,现在我们任意切,切完后 每段长度小于50,问,假若我们把这些小木棍拼为原来的木棍,那么可以得到的最短长度的原始木棍有多短。解题思路:首先,我们明确搜索的木棍范围是[maxl,sigmal/2],其中maxl为所有木棍中最长的长度,sigmal是所有木棍的长度求和。若在指定范围里面搜索不到可拼接方案,我们认为最优长度为sigmal。我们每次选取多...原创 2019-09-12 12:26:34 · 257 阅读 · 0 评论 -
洛谷 P3771 (SPFA 图邻接表)
#include <bits/stdc++.h>#define int long long using namespace std;typedef pair<int, int> ii;typedef vector<ii> vii;typedef vector<int> vi;const int INF=2147483647;int...原创 2019-09-11 15:24:27 · 172 阅读 · 0 评论