随笔分类 - LOJ
摘要:Description 给定整数n,构造一个递增的正整数序列使得a1=1,am=n,且对于任意的k(1≤k≤m)都存在ak=ai+aj,最小化序列的长度(即最小化m) Solution 由于n规模较小,所以我们可以采用迭代加深搜索来求解答案,即固定搜索的深度(序列的长度),搜索答案,若搜索不到答案则
阅读全文
摘要:Description 给定一个矩阵,要求实现区间修改,区间求和的操作 Solution 二维树状数组的模板题,类比一维,我们依旧利用差分的思想完成。 首先,运用简单的容斥思想,二维前缀和sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j]
阅读全文
摘要:普通平衡树 Description 设计一种数据结构,支持插入元素,删除元素,查询值为val的元素的排名,查询排名为rnk的值,查询x的前驱、后驱 Solution Splay的基本操作,熟悉一下Splay,这些操作事实上与Treap也能解决。 为了实现Splay,我们有如下定义及实现方法。 1.定
阅读全文
摘要:Description Treap是一种简单的平衡树,可以实现插入元素,删除元素,求元素的排名,求排名为某某的元素,查询前驱后驱 treap的本质是一棵二叉搜索树。然而,二叉搜索树很容易使复杂度退化,所以我们在每个节点上产生一个随机值,按照堆的性质维护,这样treap的深度期望为logn。 在本题中
阅读全文
摘要:这是一道毒瘤的LCA的题目。 我们对这棵树进行一次dfs,求出每一个点的时间戳,不难发现,我们按照时间戳排序,把异象石的节点排序,并且累加相邻两点的路径,最后的结果就是所求答案的两倍。 因此,我们采用STL中的set,按照时间戳递增的顺序维护异象石出现的序列,并用变量ans记录相邻两点的距离之和,那
阅读全文
摘要:关于lca和树上差分的题目。 根据题目描述,主要边是一棵树,附加边会和主要边构成一个环,如果我们第一步切断了一条主要边,我们下一步就必须切断一条附加边才能符合题意。 所以,我们可以认为一条附加边(x,y)把树上x,y之间的路径覆盖了一遍,我们需要统计每条主要边被覆盖多少次即可。具体地,如果第一步我们
阅读全文
摘要:尽管本题依旧是状压dp,但是不同的是本题的状态无法用二进制表示,而需要三进制。三进制特殊的地方在于位运算符全都不能用了,因此本题比往常的题目多了一部分,就是手写判断,而不是直接&,|,^. 可喜的是,本题状态定义极其简单,定义f[i][j]表示第i行的状态为j时,前i行的方案数,这样一来,本题与“国
阅读全文
摘要:一道入门的状压dp题,很有意思也很简单。 定义f[i][j]表示第i行的状态为j时,前i行的方案总数,那么答案ans=∑f[n][j]. 考虑状态的转移,第i-1行的状态k能转移到第i行的j,当且仅当j&k==0且j,k分别符合他们自己放在那一行的条件,所以f[i][j]=∑f[i-1][k] (条
阅读全文
摘要:这是一道使用状压dp覆盖图形的问题,我们定义f[i][j][k]表示当第i行的状态为j,前i行一共k个国王时的方案数。其中,j表示将当前这一行状态压缩后对应的二进制数。状态转移方程为f[i][j][k]=∑f[i-1][x][num(x)].我们先预处理出每一个合法的状态,并记录他们用了多少国王,再
阅读全文
摘要:树形dp可能是最优美的dp了…… 这是一道经典的树上背包问题,考虑两种做法。第一种是直接在树上做一遍背包问题,另一种是把这棵树转化成“左儿子右兄弟”的二叉树,再做一遍背包问题。 方法一:我们定义f[i][j]表示以i为根的子树,一共选j门课最大的分数,那么我们可以得到f[i][j]=max(f[i]
阅读全文
摘要:关于多重背包的一道题。 首先看数据便知道朴素的多重背包无法通过,所以我们采用二进制拆分进行优化,(二进制优化点这里),这样就能顺利通过本题了。 这道题只是判断可行性,所以“价值”这一状态并没有什么用。 1 #include <iostream> 2 #include <cstdio> 3 #incl
阅读全文
摘要:本来想用双向广搜的,但是不太好保存路径,所以我就用的普通的bfs 思路很简单,从初始状态直接搜,每次扩展三个状态,用函数模拟一下三种变换,用map存储路径即可(拒绝康托展开,拒绝哈希,拒绝状压) 不得不说,对于数据不是很毒瘤的题,STL是真的好用啊…… 1 #include <iostream> 2
阅读全文
摘要:读完题,这是一道和bfs联通快有关的搜索题,肯定要搜索一些联通快,而这道题的难点在于如何判断当前的联通快属于山峰还是山谷。 因此,我们设计一个算法,在用bfs求联通快的同时,判断当前联通快是山峰山谷或者啥都不是。 具体地,我们像往常一样搜索联通快,若扩展的节点高度与当前联通快不同,则开始判断:如果大
阅读全文
摘要:这是一道广搜题,难点在于对题目的理解和对细节的处理。 对于一个节点,可以向左上、左下、右上、右下四个位置扩展,根据地图的形态确定每一步扩展的代价。 将代价最小的节点放在队头,这样用双端队列来实现。每个节点最多进出队列一次,所以时间复杂度为O(r*c) 1 #include <iostream> 2
阅读全文
摘要:NOI2015的试题,一道树链剖分的模板题主要过程:树剖完成后对线段树进行区间修改,区间查询。代码较长,很考验代码能力 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 typedef long long ll; 5 i
阅读全文