随笔分类 - POJ
摘要:Solution 由于搜索量较大,我们采用IDA*算法求解。 按照迭代加深搜索的基本方法,我们限制搜索深度,然后寻找在当前限制下是否存在解。 为了提高算法效率,我们设计A*函数作为估价,返回目标位置与实际不同的个数即可。 在搜索时我们不妨记录上一步搜索的分支,以免执行上一次操作的逆操作。 本题难点主
阅读全文
摘要:Description 给定整数n,构造一个递增的正整数序列使得a1=1,am=n,且对于任意的k(1≤k≤m)都存在ak=ai+aj,最小化序列的长度(即最小化m) Solution 由于n规模较小,所以我们可以采用迭代加深搜索来求解答案,即固定搜索的深度(序列的长度),搜索答案,若搜索不到答案则
阅读全文
摘要:Description 给定形如$a^x\equiv b\pmod p$的高次同余方程,求解$x$ Solution BSGS的模板题 假设$x=i*t-j$,并且$t=\lceil\sqrt p\rceil,0\leq j\leq {t-1}$ 那么方程可化为$a^{i*t-j}\equiv b\
阅读全文
摘要:单调队列优化dp 我们将每个人的s值排序,这样我们就能保证当前这个人刷的木板一定在上一个人之后,我们就能进行线型dp 定义f[i][j]表示前i个人刷前j个木板获得的最多报仇,那么有 在dp过程中,我们假定外层变量i为定值,当j增大时,不难发现k的取值范围上界不变,下界变大。我们不妨比较一下两个决策
阅读全文
摘要:线型dp+线段树优化 我们定义f[i]表示覆盖[L,i]的最小代价,我们将牛按照r递增排列,假设当前牛为[ai,bi],代价为vali 那么存在 我们在状态转移时,每次需要查询区间内的最值,同时f数组发生更新,因此我们可以用线段树的查询、修改在较快时间内维护f数组。 同时我们注意一下边界的处理即可。
阅读全文
摘要:记忆化搜索的经典例题 一个显然的想法,直接枚举每一个点作为起点然后dfs,求出最大值。显然这种做法一定会TLE,我们不妨进行一下优化:由于每一个点会被重复搜索,我们不妨进行记忆化,当这一个点搜索完成后,我们记下从这个点出发的最优解。下次搜索到这个点时我们就可以O(1)返回答案,这样搜索效率大大提高,
阅读全文
摘要:动态维护中位数的题目。 我们采用对顶堆做法,建立一个大根堆存储前半段序列(排序后),小根堆存储后半段序列,通过维护两个堆使得他们元素个数之差不大于1 ,这样这个序列的中位数就是大根堆的堆顶。 关于如何维护对顶堆:如果两个堆元素个数差大于1,我们就把大根堆的堆顶放到小根堆当中(或是把小根堆堆顶放到大根
阅读全文
摘要:树的直径的模板题 我们存图以后,对这张图(树)进行一次dfs,定义sum1表示从当前节点向他的儿子走的最长路径是多少,sum2表示次长路径是多少。我们每次先用当前路径的长度+当前路径前往的节点的sum1更新当前节点的sum2,如果更新后sum2大于sum1,那么我们交换他们的数值,不难发现这样是正确
阅读全文
摘要:好像跟POJ重题 这是一道扫描线的题。 由于窗口的大小已知,我们不妨换一下思路,把问题转化成这样:平面内有若干个矩形(大小就是窗口的大小,矩形左下角的位置就是某一颗星星的位置),每一个矩形覆盖的区域都有一个权值(星星的亮度),求某一位置,使得这个位置被覆盖的权值最大,最大值即答案。 为什么这样就是正
阅读全文
摘要:线段树扫描线的应用 我们尝试设想有一条无限高的竖线左往右扫过这个并集图形,按照每一个矩形的的左右边界,我们可以将这个并集图形分为2n 段,对于两两相邻的部分,我们可以分别计算面积,这样就得到了整个并集图形的面积。 如图,我们就是把每个矩形的左右边界提了出来,就变成了这样一些线段。 那么我们需要这些量
阅读全文
摘要:一道线段树区间合并的问题。 我们需要每次用线段树查找是否存在一个连续的为0的且长度不短与x的子序列、查找完成后需要返回这个子序列的左端点,并且将该子序列全部赋值为1,还需要用线段树完成对一个子序列的赋值。 我们在线段树的每一个节点上维护四个量:tag,sum,l,r分别表示该区间的值(0表示全部为0
阅读全文
摘要:这道题可以用Splay、fhq-treap解决,但是平衡树解这道题大材小用,所以我采用了对顶堆解决。 考虑建立两个堆:以i为分割点,用大根堆存储前半段序列,用小根堆存储后半段序列。我们控制大根堆的元素个数为i,这样查询时大根堆的堆顶就是排名为i的元素。然后我们考虑维护对顶堆。 对于add操作,我们先
阅读全文
摘要:一道“扩展域”并查集的题目,我们把每一个点拆分成三个域:同类、食物、天敌。 我们假设x的同类域为x,食物域为x+n,天敌域为x+n+n。假设x与y是同类,那么说明x+n与y+n是同类,x+n+n与y+n+n是同类。 假设x吃y,那么x+n与y是同类,x+n+n与y+n是同类,x与y+n+n是同类。
阅读全文
摘要:一道经典的贪心题。 我们不妨将物品按照价值从大到小排序,对于每一个物品,我们尽量让它晚一些被售出,这样得到的答案一定是最优解。 我们可以简单证明一下,首先我们先售出获利较大的物品,这个的正确性是显然的。对于某一个物品,我们最好在时间范围之内让它最晚被售出。为什么呢?因为这个物品在允许范围内的任意时间
阅读全文
摘要:关于lca和树上差分的题目。 根据题目描述,主要边是一棵树,附加边会和主要边构成一个环,如果我们第一步切断了一条主要边,我们下一步就必须切断一条附加边才能符合题意。 所以,我们可以认为一条附加边(x,y)把树上x,y之间的路径覆盖了一遍,我们需要统计每条主要边被覆盖多少次即可。具体地,如果第一步我们
阅读全文
摘要:这是一道树形dp的基本模型——树的最大独立集问题。 这种基本模型的解法是这样的:定义f[i][1/0]表示在以i为根的子树中,i选/不选的最小代价是多少,那么答案是min(f[0][1],f[0][0])。 考虑状态转移,对于i的每一个儿子j,若i选择,那么j可选可不选,如果i不选,那么j一定选。
阅读全文
摘要:一道别样的区间dp,重点在于对字符串的处理。 读完题,我们很自然的想到区间dp,定义f[i][j]表示从折叠i~j的部分的最小长度,那么答案为f[1][n]。 区间dp的转移一般而言都是一样的,在区间中枚举一个位置,使这一个大区间分成两个小区间。因此状态转移方程我们不在赘述。 我们重点探讨一下对于字
阅读全文
摘要:有关树形dp+二次扫描与换根法 首先我们读入数据,用邻接表存储,并记录每一个点相连的边的数量。 我们不妨先暂时假定节点1为树根,定义d[x]表示在以x为根的子树当中最大的流量,显然得出状态转移方程 d[x]=∑min(d[y],c(x,y)) 其中y∈son(x). 求出了d数组,我们考虑“二次扫描
阅读全文
摘要:一道非常棒的搜索题,做完之后感觉神清气爽…… 可以肯定的是,本题属于走地图一类的搜索题,适合用bfs求解,然而本题细节极多,有很多需要注意的地方。 我们定义状态三元组(x,y,z)表示当前移动到位置(x,y),且朝向z(我们不妨假定z=0意味着长方体立在地面上,z=1 意味着长方体横躺,x,y表示左
阅读全文
摘要:状压dp的一种经典模型,覆盖问题。 我们定义f[i][j]表示当第i行的状态为j时,前i行的方案数。显然答案为f[n][0]. 关于压缩状态,我们定义一个m位的二进制数,其中第i位为1的含义是,第i列是一个竖着的矩形的上半部分。第i位为0则表示其他情况。 因此,第i-1行的状态k能转移到第i行的状态
阅读全文