随笔分类 -  洛谷

摘要:Description 给定一棵树和若干操作,每次可以选取树上任意两点之间的路径染成一种颜色,或是查询任意两点之间路径上有多少段颜色。 Solution 树链剖分不解释,主要分析线段树的维护,在线段树区间上我们维护区间左端的颜色、右端的颜色、整个区间颜色段的数量。那么当我们合并两个区间时,我们首先将 阅读全文
posted @ 2019-07-14 13:42 AD_shl 阅读(210) 评论(0) 推荐(0)
摘要:Description 给定一个01矩阵,求出最大的正方形子矩阵和最大长方形子矩阵,并保证取出的矩阵中的元素都为0/1 Solution 为了使题目变成上述表述的形式,我们首先将读入的矩阵的部分元素xor1,使其变成一般形式 之后,这道题变成了两道题的合体:洛谷P2701巨大的牛棚与P4147玉蟾宫 阅读全文
posted @ 2019-07-06 15:27 AD_shl 阅读(305) 评论(0) 推荐(0)
摘要:Description 给定一个棋盘, 在棋盘上放入m个炮,使得炮两两之间不能攻击,求出方案数。 Solution 考虑设计一个dp,定义f[i][j][k]表示前i行、有j列放了一个炮、有k列放了两个炮的方案数。 有一个显然的结论:如果方案合法,那么任何一行(列)的炮的数量最多为2。 然后我们思考 阅读全文
posted @ 2019-07-06 14:29 AD_shl 阅读(231) 评论(0) 推荐(0)
摘要:Description Treap是一种简单的平衡树,可以实现插入元素,删除元素,求元素的排名,求排名为某某的元素,查询前驱后驱 treap的本质是一棵二叉搜索树。然而,二叉搜索树很容易使复杂度退化,所以我们在每个节点上产生一个随机值,按照堆的性质维护,这样treap的深度期望为logn。 在本题中 阅读全文
posted @ 2019-07-05 16:05 AD_shl 阅读(241) 评论(0) 推荐(0)
摘要:Description Solution 每个人能看到的动物只有5个,所以我们可以将这个进行状压,定义f[i][j]表示从第i开始的五个动物状态压缩后(移走或不移走)为j的最优结果 那么转移方程可以得到 其中,val表示这一步转移所获得的收益,由于动物园是环形的,所以初状态等于末状态,我们枚举末状态 阅读全文
posted @ 2019-07-04 11:25 AD_shl 阅读(270) 评论(0) 推荐(0)
摘要:这是一道树形dp和状压dp结合的题目,思考量和代码细节都不少。 我们首先定义f[i][j]表示在以i为根的子树当中,建立分部的节点状压之后为j的最大收益 那么转移是显然的,定义k为i的儿子,那么f[i][j] = max(f[k][l] + f[i][j ^ l] + val). 其中val表示其他 阅读全文
posted @ 2019-07-03 20:35 AD_shl 阅读(261) 评论(0) 推荐(0)
摘要:这道题实质上是求序列的最长不下降子序列 按照题意,我们要求出最小的代价,也就是说我们要让尽可能大的代价不动,也就是求出最长不下降子序列,之后用序列的和减去它即可。 阅读全文
posted @ 2019-06-24 21:27 AD_shl 阅读(152) 评论(0) 推荐(0)
摘要:一道不怎么简单的dp题 我们定义状态f[i][j][k][val](其中val∈{0,1})表示A串的前i个字符,分成k段,与B串的前j个字符匹配,并且A[i]选/不选的方案数。 那么我们考虑状态的转移, 当a[i]==b[j]时,f[i][j][k][1]可以从f[i-1][j-1][k-1][0 阅读全文
posted @ 2019-06-24 19:53 AD_shl 阅读(211) 评论(0) 推荐(0)
摘要:最短路的扩展题。 在没堵车之前,他会按照这张图的最短路走,所以我们跑一下dijkstra求一遍不堵车情况下的最短路,同时记录最短路径上每一个点的前驱。 考虑堵车的情况,我们枚举每一条边作为堵车的边,并标记。再跑一边dijkstra求一遍除这条堵车边的最短路,更新答案。 我们枚举每一条边作为堵车的边, 阅读全文
posted @ 2019-06-24 16:51 AD_shl 阅读(193) 评论(0) 推荐(0)
摘要:这是一道状压dp的入门练习题 我们可以预处理出每一行国王的合法摆放方案,然后进行dp。 我们定义f[i][j][k]表示前i行,第i行的状态为j且使用了k个国王的合法方案数,那么存在 f[i][j][k]=∑f[i-1][j'][k'],其中j&j'=0,j&j'<<1=0,j&j'>>1=0 注意 阅读全文
posted @ 2019-06-20 19:00 AD_shl 阅读(246) 评论(0) 推荐(0)
摘要:纯搜索题 一开始思路比较混乱,但是仔细想想便能得出正解。 我们预处理出每一棵子树的大小、每一层的儿子们,之后进行一次dfs,暴力枚举删除每一棵子树,同时更新答案,同时注意标记是否删除。搜索完成后回溯。最终就能得出答案。 1 #include <bits/stdc++.h> 2 using names 阅读全文
posted @ 2019-06-19 21:19 AD_shl 阅读(213) 评论(0) 推荐(0)
摘要:贪心题,我们使用邻项交换的方法求解。 我们假设当前有两个相邻的人分别为1,2,他们的左右手的数字分别为a,b,假设1之前的人的左手的数字之积为x,那么当前的答案为 我们将这两个人的位置交换,显然,这两个人位置的交换不会影响其他的人的答案,那么交换后的答案为 我们假设以上四个数分别为k1,k2,k3, 阅读全文
posted @ 2019-06-17 21:14 AD_shl 阅读(246) 评论(0) 推荐(0)
摘要:dfs+dp 我们要在一个大矩阵中选出一个小矩阵使得小矩阵的分值最小 所以我们先用dfs枚举选哪些行,再在dfs选的行的基础上对列进行dp,最后更新答案即可。 具体地,我们先通过dfs枚举r行,然后计算两个数组:sum[i][j]表示在当前dfs确定的行的状态下,第i列和第j列相邻时产生的分值。s[ 阅读全文
posted @ 2019-06-15 21:12 AD_shl 阅读(542) 评论(0) 推荐(0)
摘要:本人是NOIP2017的亲历者,两年前这道题我在考场上随便打了个二分暴力,就草草结束了 如今在做这道题,便能简单的AC了 我采用的思路是二分答案,然后用dp判断答案的可行性。定义f[i]表示到i这个格子最大的分数,如果为一个极小值则可以认为这个点无法到达;x[i]表示i的位置,g表示当前二分的答案。 阅读全文
posted @ 2019-06-08 15:38 AD_shl 阅读(679) 评论(0) 推荐(0)
摘要:记忆化搜索的经典例题 一个显然的想法,直接枚举每一个点作为起点然后dfs,求出最大值。显然这种做法一定会TLE,我们不妨进行一下优化:由于每一个点会被重复搜索,我们不妨进行记忆化,当这一个点搜索完成后,我们记下从这个点出发的最优解。下次搜索到这个点时我们就可以O(1)返回答案,这样搜索效率大大提高, 阅读全文
posted @ 2019-06-02 10:54 AD_shl 阅读(503) 评论(0) 推荐(0)
摘要:好像跟POJ重题 这是一道扫描线的题。 由于窗口的大小已知,我们不妨换一下思路,把问题转化成这样:平面内有若干个矩形(大小就是窗口的大小,矩形左下角的位置就是某一颗星星的位置),每一个矩形覆盖的区域都有一个权值(星星的亮度),求某一位置,使得这个位置被覆盖的权值最大,最大值即答案。 为什么这样就是正 阅读全文
posted @ 2019-06-01 17:04 AD_shl 阅读(304) 评论(0) 推荐(0)
摘要:线段树+状压 在线段树上维护一个值表示这个区间的颜色,具体地讲,我们将这个区间的颜色进行状压,第1种颜色对应状压后的第1位,以此类推。这样我们维护的这个数就是状压之后的数,在合并区间时将两个数按位或即可,区间取值直接覆盖即可,最后我们统计答案时只需统计这个数有多少个1即可。 1 #include < 阅读全文
posted @ 2019-05-26 10:58 AD_shl 阅读(253) 评论(0) 推荐(0)
摘要:做完这道题,我只想说:爽啊! 这道题的难点在于我们要支持区间赋值、区间翻转、区间最长子序列、区间求和这几种操作。 我们建一棵线段树,维护以下信息:sum区间1的个数max[0/1]区间内0/1最长连续子段lmax[0/1]包含区间左端点最长0/1子段rmax[0/1]包含区间右端点最长0/1子段鉴于 阅读全文
posted @ 2019-05-25 20:11 AD_shl 阅读(266) 评论(0) 推荐(0)
摘要:一道感觉不错的并查集的题目 我们先将每一组矛盾关系按照冲突值从大到小排序,然后顺序扫描一遍,让冲突值大的两个人尽可能不在一个监狱里,如果不能满足,那么答案就是这组关系的矛盾值。如果所有的矛盾都不会发生,那么答案就是0. 之后我们建立并查集,另外定义一个辅助的数组d表示每一个人的一个敌人。我们扫描每一 阅读全文
posted @ 2019-05-25 12:52 AD_shl 阅读(211) 评论(0) 推荐(0)
摘要:这道题可以用Splay、fhq-treap解决,但是平衡树解这道题大材小用,所以我采用了对顶堆解决。 考虑建立两个堆:以i为分割点,用大根堆存储前半段序列,用小根堆存储后半段序列。我们控制大根堆的元素个数为i,这样查询时大根堆的堆顶就是排名为i的元素。然后我们考虑维护对顶堆。 对于add操作,我们先 阅读全文
posted @ 2019-05-18 21:35 AD_shl 阅读(222) 评论(0) 推荐(0)