摘要: 计划在6月30前跟上hiho一下的进度,同时对每周的题目进行简单的总结。算是一个小挑战,希望自己能够达成! 阅读全文
posted @ 2015-04-19 15:34 xblade 阅读(123) 评论(0) 推荐(0)
2015年5月31日
摘要: 题目描述 维护一个集合,集合中的元素与点u的最短距离已经确定,求出集合内元素所能到达的点到点u的距离,取最短的距离对应的点加入集合直到集合包含点v。 每次更新距离只与新加入集合的点有关。#include #include #include #define N 1005 unsigned w[N][N]; int main(){ memset(w, -1, sizeof(w));... 阅读全文
posted @ 2015-05-31 23:34 xblade 阅读(216) 评论(0) 推荐(0)
摘要: 题目描述 之前提到过,线段树之所以更新查询快,是因为区间更新有lazy标记使得不需要每次都操作到叶子节点。 但是如果要操作一个节点时,其父节点上的lazy标记应当被释放,否则该节点无法得到最新的正确结果。 因而lazy标记下放的策略是在需要操作某个节点的子节点时,将该节点的lazy标记全部下放。见第69行。 同时应当注意,给某个节点增加lazy标记时,不要忘了修改该节点的相关统计值。因为更新完该节... 阅读全文
posted @ 2015-05-31 21:57 xblade 阅读(506) 评论(0) 推荐(0)
摘要: 题目描述 区间覆盖问题,区间绝对位置并不重要,重要的是各个更新的区间段之间的相对位置关系。 举例而言,离散化将区间更新[1,100], [2, 50]更换为区间更新[1,4], [2,3]。 离散化可以将空间复杂度从O(L)降到O(N),进而也降低了更新和查询操作的复杂度。 用一个map来记录绝对位置与相对位置间的映射。 需要注意的是,离散化的线段树的叶子节点是[i, i+1]而不是[i, i],... 阅读全文
posted @ 2015-05-31 11:32 xblade 阅读(189) 评论(0) 推荐(0)
2015年5月14日
摘要: 题目描述 区间修改有别于单点修改,如果每次都修改到叶子节点,复杂度可以退化到O(n)。 因此为节点引入一个lazy标记,修改时,如果待修改区间与某个节点的区间重合,那么这个节点更新值后标记lazy,不再修改其子节点。 类似于查询操作,这个修改操作的复杂度是O(logn)。 另外,查询或修改时,如果遇到已经标记了lazy的节点,需要先将lazy标记下放到两个子节点,再进行后续处理。#include ... 阅读全文
posted @ 2015-05-14 17:58 xblade 阅读(187) 评论(0) 推荐(0)
摘要: 问题描述 依然是RMQ问题。过程需要修改某些点的数据。 使用线段树解决。 单点修改的复杂度是O(logn),即树深,只需要修改这个点的祖先节点。 区间查询的复杂度也是O(logn),因为除了第一步可能一分为二外,其他查询若有分解则分解后必然有一个区间是不需要再分解的。#include #include typedef struct _seg_tree_ { int left, rig... 阅读全文
posted @ 2015-05-14 13:33 xblade 阅读(230) 评论(0) 推荐(0)
摘要: 问题描述 询问区间最小值,过程中会对某些位置的值进行修改。 这题数据量很小,使用O(NQ)的方法做。 后续会有其他高效的解法。#include int data[10005]; int main(){ int n, q; scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", data +... 阅读全文
posted @ 2015-05-14 13:16 xblade 阅读(325) 评论(0) 推荐(0)
2015年5月9日
摘要: 题目描述 这次是使用在线算法解决这个问题。 两个节点的最近公共祖先就是这两个节点的通路上深度最浅的那个节点。 可以通过一遍深搜把树转成数组:每次经过一个节点(无论是从父节点进入还是从子节点返回)时,把它放入数组。同时要记录每个节点在数组中最后一次出现的位置。 使用RMQ-ST算法预先计算2^k长度区间内深度最浅的节点编号。 对于每次询问,将其转换为两个区间段求解。#include #includ... 阅读全文
posted @ 2015-05-09 21:46 xblade 阅读(175) 评论(0) 推荐(0)
2015年5月8日
摘要: 问题描述问题就是询问区间内的最小值。数据量n, 查询量q。朴素的算法复杂度O(nq)。为减少冗余计算,预先计算出每个位置起 2^k 长度范围内的最小值。data[i][j]表示从 i 起的 2^k 个元素的最小值。递推式 data[i][j] = min{data[i][j – 1], data[i... 阅读全文
posted @ 2015-05-08 22:27 xblade 阅读(173) 评论(0) 推荐(0)
摘要: 题目描述这次使用离线算法来解决最近公共祖先的问题。离线算法可以一遍 dfs 处理完所有的查询,因而需要把查询全部储存起来。具体的 dfs 过程是:所有节点最初标记为白色,第一次经过该节点时,将其染成灰色,第二次经过该节点时(即离开该节点时)将其染成黑色。在 dfs 的某个状态下,白色代表未访问的节点... 阅读全文
posted @ 2015-05-08 21:00 xblade 阅读(213) 评论(0) 推荐(0)
2015年5月6日
摘要: 题目描述并查集,顾名思义有两个操作:合并和查询。并就是把两个集合合并到一起。查就是查询两个节点是否属于同一个集合。每个节点有一个父节点。一个集合内存在一个唯一的根,判断根的条件就是节点的父节点是不是该节点本身。合并操作就是把一个集合的根接到另一个集合的根上。而查询操作就是找两个对象是否有同一个根。查... 阅读全文
posted @ 2015-05-06 21:41 xblade 阅读(236) 评论(0) 推荐(0)