随笔分类 - 数据结构
摘要:一、题目 Turing Tree 二、分析 这题主要还是在区间的处理上。 为了保证区间内的数没有重复的,那么可以对区间按右端点从小到大排序,这样对原数组处理时,尽量保证不重复的元素靠右(可以假设右端点固定考虑),就可以保证区间求出来的值是不重复的,对于重复的就把前面位置出现的这个数减掉(即赋值为0)
阅读全文
摘要:一、题目 Gcd & Lcm game 二、分析 非常好的一题。 首先考虑比较暴力的做法,肯定要按区间进行处理,对于lcm和gcd可以用标准的公式进行求,但是求lcm的时候是肯定会爆long long的。 考虑用素数分解,将所有的数分解后,发现素因子的个数有限,且每个因子的幂也有限,
阅读全文
摘要:一、题目 Buy Tickets 二、分析 首先可以明确的是每个人的位置都是定的,那么如果从输入数据从后往前看,最后面的人进来的时候,他前面的人数肯定是定的。 那么可以考虑,当从后往前推时,这个人插入的位置就是他前面有多少空位,假设他的位置比空位数少,那显然是不可以的,如果他的位置比空位多,那么后面
阅读全文
摘要:一、题目 Huge Mission 二、分析 区间更新,用线段树的懒标记即可。需要注意的时,由于是在最后才查询的,没有必要每次更新都对sum进行求和。还有一点就是初始化的问题,一定记得线段树上每个点都需要初始化。 三、AC代码
阅读全文
摘要:一、题目 Sticks Problem 二、分析 对于i和j,并没有很好的方法能同时将他们两找到最优值,所以考虑固定左端点i。 固定左端点后,根据题意,a[i]是最小值,那么现在的问题就转化成了求以a[i]为左端点最小值的范围内,找到一个最大值a[j]的j,然后相减就是以
阅读全文
摘要:一、题目 【XR-3】核心城市 二、分析 题意就是在树中确定K个点,满足剩下的N-K个点中到这K个点的最大距离尽可能小。 理解上肯定是确定一个根,这个根是这个图的中心。 可以通过根据结点的高度,从树的外层一层一层往里面剥,那么每次剥的结点一定是队列里比较靠外的,且加进去的点要么和他同层,
阅读全文
摘要:一 题目 D-query 二 分析 主席树的运用。 这题首先应该考虑的是,如何分出种类数?再就是考虑如何维护区间信息? 最开始想的是直接离散化后用权值线段树建主席树,发现不行,因为假如 [l,r] 的值在l之前已经出现了,那么直接用历史版本的相减肯定会出问题。所以排除此方法。 所以在维护历史
阅读全文
摘要:一 题目 [SDOI2011]染色 二 分析 感觉树链剖分的这些题真的蛮考验码力的,自己的码力还是不够啊!o(╯□╰)o 还是比较常规的树链剖分,但是一定记得这里的线段树在查询的时候一定要考虑链于链相邻的两个点。 一开始自己已经把很多坑都已经注意了,包括颜色可以为0,链的相邻点,但怎么就是不正确,还
阅读全文
摘要:一 题目 [HAOI2015]树上操作 二 分析 树链剖分的题,这里主要用到了dfs序,这题比较简单的就是不用求lca。 1.和树链剖分一样,先用邻接链表建双向图。 2.跑两遍dfs,其实这题可以不这么写,主要是为了确定树型结构转线型后各节点的编号,以及各个链的top,top很关
阅读全文
摘要:一 题目 QTREE 二 分析 第一道树链剖分的题,写的好艰难啊。 题意还是比较好理解的,就是在树上操作。 对于修改,题中要求的是单点修改,就算是直接树上操作也是非常简单的。 对于查询,查询的时候,是查询树上一个结点到另一个结点的这条链上的最大值。这里就需要用树链剖分了。 树链剖分,其实就是把树型转
阅读全文
摘要:一 题面 [NOI2004]郁闷的出纳员 二 分析 模板题。 对于全部员工的涨工资和跌工资,可以设一个变量存储起来,然后在进行删除时,利用伸展树能把结点旋转到根的特性,能够很方便的删除那些不符合值的点。同时,维护的结点数量信息也方便我们进行结果的统计。 三 AC代码 1 #include <cstd
阅读全文
摘要:一 题面 K-th Number 二 分析 第一个主席树的题,感触蛮多吧,几个关键点就是可持久化数据结构,这里的主席树其实就是保留了之前各个版本的权值线段树,然后利用权值线段树和历史版本可以进行相加减的优势,实现了第K小。 三 AC代码
阅读全文
摘要:一 题面 Tyvj 1728 普通平衡树 二 分析 比较明显是可以用平衡二叉搜索树(splay)做的。 用权值线段树做,前提就是要先离散化,因为权值线段树维护的值域信息。 板子。 三 AC代码 1 #include <iostream> 2 #include <algorithm> 3 #inclu
阅读全文
摘要:一、题目 UVA11922 二、分析 为什么会有伸展树? 伸展树与AVL的区别除了保持平衡的方式不同外,最重要的是在每次查找点时,让该点旋转到根结点,这里可以结合计算机里的局部性原理思考。 伸展树有什么优势? 有了伸展树,我们可以根据每次到根节点的值,根据二叉搜索树的性质,可以将整棵树划分成两个部分
阅读全文
摘要:一、题面 UVA11020 二、分析 最近脑子有点不好使吧,这题还想了很久。 对于给定的两个值要满足题面中的条件,那么我们可以把这两个值转化到平面中的坐标去理解。 首先,需要考虑的是维护的所有点其实是一个严格有序的,画个图就可以理解了。 此时,在维护的所有点的基础上,如果来了一个点,我们可以先考虑x
阅读全文
摘要:一、引文 二叉搜索树的查找效率取决于平均搜索长度,而这又取决去树的形状。当二叉搜索树退化为一个链表时,查找效率非常低。理想的形状是任何结点的左右子树的高度最多相差1,而这样的二叉树我们也称之位平衡二叉树。 二、分析 平衡二叉树的最核心的地方就在于四种旋转情况 左左情况:右旋 即相对根结点的左子树的高
阅读全文
摘要:一、题面 POJ3470 二、分析 POJ感觉是真的老了。 这题需要一些预备知识:扫描线,离散化,线段树。线段树是解题的关键,因为这里充分利用了线段树区间修改的高效性,再加上一个单点查询。 为什么需要离散化? 坐标太分散了,据说可以到 long long,但是就这么多个点,所以离散化一下,方便处理。
阅读全文
摘要:一、题面 POJ3368 二、分析 仍然是一道只需要区间查询不需要区间修改的线段树题。 这题的题面比较特别,它是一组非减的数组。当需要去找一段区间内出现次数最多的数字时,这些数字必然是连续的,那么就可以用线段树维护区间内出现的最大次数时,同时维护两端的数字出现的次数。这样,就可以在建树的时候通过判断
阅读全文
摘要:一、题面 POJ3264 二、分析 典型的区间问题,没有更新只有查询。 可以用线段树,也可以用ST表,但ST表空间上可能会多点。 查询的时候需要注意的是,在判断区间是完全属于右子树还是左子树时,要根据建树的情况来选择,不然会出错。具体看代码 三、AC代码
阅读全文