07 2019 档案
摘要:题目链接 题目大意就是,每个点连着两条边,就是人喜欢做的两个位置,求所有座位匹配上的最大匹配 这里,我们开一个二维的就好,表示两列的座位是否匹配上,返回01即可。 匈牙利模板题。
阅读全文
摘要:题目链接 二分图最大匹配的模板。 对于二分图: 我们称,一个图中,当且仅当其没有奇环时,是一个二分图。 那么,最大二分图匹配就是: 给定二分图,现在要选出一些边,使得与每一个点相连的边最多选出一条,求最多选出的边数。 当所有边都被匹配上时,称之为一个完美的二分图匹配。 来一个例题吧: 从前有a个男生
阅读全文
摘要:明天好像要考链表今晚笔者来了解下。 题目链接 解: 对于这道题,由于前面要与后面重新连起来,于是我们考虑链表。 我们先正常用链表维护关系。然后,我们从大到小枚举。 对于这个数,如果它后面有数(因为是一对一起进入),就把它们压入队列(输出即可) 这样就利用链表完成了一个贪心的过程。 Code:
阅读全文
摘要:数论基础篇吧,与Exgcd有脱不开的关系。 这个算法,就是要让我们求n个线性同余方程的共同解的最小值,即最小整数解。 我们可以设:M为所有模数之积,Mi=M/b[i],ti为Mi*ti在模ai(模数)意义下同余1的方程的一组解,且模数均互质。 我们则有:方程组的特解为M1*t1*b1+...+Mn*
阅读全文
摘要:笔者大概看了一下单调队列对于DP的优化,故撰此文,望有帮助。 (dp还是推式子难啊qwq) 例题1. 题目大意:在n个数的序列中,选择数字,使得其连续不超过k个数,且和最大。 本题的方程相对好推:设dp[i][0/1]为到了第i个数,且第i个数不选/选的最大值。 则有转移:dp[i][0]=max(
阅读全文
摘要:我们已知,求最大公约数的方法: 求A,B两数的最大公约数,递归求解,递归边界是B==0. gcd(a,b)=gcd(b,a%b) 我们进一步来求Ax+By=Gcd(A,B)的解。 尝试套用欧几里得求法? 我们希望,有整数X,Y,使得: bX+(a%b)Y=Gcd(a,b). 那么我们有: bX+(a
阅读全文
摘要:算是笔者的数学第一题吧…… 题目链接 解: 显然我们已知的条件有:青蛙A和青蛙B的初始坐标,跳动速度以及纬线长度。想要相遇,显然要使得跳动长度是L的整数倍。 那么,我们设它们跳了T步,则有: X+mT-(Y+nT)=LP,P为正整数。 移项整理,得: X+mT-Y-nT=LP X-Y+(m-n)T=
阅读全文
摘要:题目链接 笔者太菜直到现在才开始看最短路加二分…… 解: 显然题目要二分,因为根据多年的经验,看到最大值最小,二话不说想二分…… 既然问的是收费情况,那我们不妨二分收费情况。 题目都让我们输入交费数组了,不用它用谁呢? l=1,r=n,开始二分。注意,左右边界是数组下标。 二分前,注意排序,sort
阅读全文
摘要:线段树差分经典题。 题目链接 解: 对于题目中要求的维护区间颜色种数,暴力维护必定不可取。于是,我们考虑线段树的性质:从下向上维护左右区间信息。 那么,我们可不可以利用这一点来简单维护它的颜色种类数呢? 我们可以维护一组地雷(颜色)的开头和结尾。 显然,我们这样可以任意求出任意区间的开头数和结尾数。
阅读全文
摘要:好久没有看图论了,就从最短路算法开始了。 dijkstra算法的本质是贪心。只适用于不含负权的图中。因为出现负权的话,贪心会出错。 一般来说,我们用堆(优先队列)来优化,将它O(n2)的复杂度优化为O((m+n)logn) 模板链接 套用dijkstra模板即可。给出范例: 简单例题1: 仍旧是简单
阅读全文
摘要:题目链接 我来补博客例题了…… 对于本题,我们维护不同物种之间的关系。设有动物A,B,则必有: 1.A>B 2.A=b 3.A<B. 所以,对于三种关系,我们都需要维护。 不妨,我们开三倍大小的并查集,其中,1~n是A种群,n+1~2n是B种群,2n+1~3n是C种群,并设有: A>B,B>C,C>
阅读全文
摘要:笔者最近刷到了一道带权并查集的题目,当做入门博客写一篇学习笔记吧。 题目链接 题目中要求求距离+换爹,很显然,暴力的dfs在20000的数据下绝对会被卡的。 自然想到,什么数据结构可以快速维护父子关系? 显然有并查集。 那么,我们要做的就是修改并查集,使它能够维护距离了。 那么,我们在每一次更新父亲
阅读全文
摘要:题目链接 对于基本区间dp,设dp[l][r]是区间l到r的最大价值。 我们可以枚举区间的长度,在枚举左端点,判断即可。 当右端点大于n,就break。 dp[l][r]=max(dp[l+1][r]+v[l]*(n-i+1),dp[l][r-1]+v[r]*(n-i+1)) 别忘了初始化,dp[i
阅读全文
摘要:区间dp模板题 题目链接 题目要求一个环中的最小价值和最大价值(如题)。 首先,我们段环成链,即开两倍的空间,i与i+n对应。 用前缀和预处理出任意区间中的和。 接下来,我们枚举段环的位置。 设dp[i][j]是i到j合并的最小价值。 显然我们可以枚举k作为段环的点,方程即为: dp[i][j]=m
阅读全文
摘要:1.A+B problem(dp) 看成完全背包即可。先筛一遍素数,然后枚举素数个数,在枚举价值,dp即可。 代码: 【openjudge9267】(dp求方案数) 我们设dp[i][0]是第i位不放的方案数,dp[i][1]是第i位放的方案数,则有: dp[i][0]=dp[i-1][0]+dp[
阅读全文
摘要:题目链接: 解: 题意就是让我们求每次以a[i]结尾的最长不降子序列的和。 那我们先预处理出来以每一个数结尾的最长不降子序列的长度,放在e[i]中,即以第i个数结尾。 用基础dp求出即可。 那么我们定义sum数组,表示以i结尾的最长不降子序列的和。 那么枚举i之前的数,有:当e[i]==e[j]+1
阅读全文
摘要:序列双段最大子段和问题 (也许很水但蒟蒻刚刚学dp就来记录一下) 题目链接 题意就是求序列中的任意两段的最大子段和最大。 我们先预处理出来前缀和,方便求最大子段和。 对于每一个i都求一遍1到i的最大子段和,即: 其中,a数组是前缀和,直接处理的。 那么,我们再对n到1的每一个i求一遍最大子段和,即:
阅读全文
摘要:背包也好久,没看了……看了一道比较难的背包,再去做些简单的熟悉一遍 题目连接 解: 先来看看题目中出现的条件:时间,生命,高度。 对于每个垃圾落下来的时间,首先来一波排序。以下落时间升序排序。 怎样设计状态? 将垃圾看做物品,生命值看做价值,增加的高度看做体积。总高度即为背包容量。 那么:设dp[i
阅读全文
摘要:继续练习dp,本文讲解nlogn算法 导弹拦截 解: 题意就是让我们求一个最长不下降子序列和一个最长上升子序列的长度 STL还是比较方便的,大致介绍一下upper_bound和lower_bound的用法 对于lower_bound,它是返回数组中第一个大于等于x的数,并返回指针。 对于upper_
阅读全文
摘要:暑假终于要到了,虽然成绩炸掉了,但是学oi还是得继续呀…… 题目:尼克的任务 解: 对于本题,又是一道经典的线性dp问题。首先考虑设计状态: 设dp[i]是i到n时间中休息时间最长的时间,则最后答案就是dp[1] 对于此状态,我们有: 1.当此时没有任务,则dp[i]=dp[i+1]+1,即上一时刻
阅读全文
摘要:期末考试结束了,来写写blog吧 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿。终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是完整的一双
阅读全文