随笔分类 - 数据结构——线段树&树状数组
摘要:Description 给定一棵树和若干次操作,树上节点的权值一开始都是0,要求完成如下操作: 令x,y两点间路径上点的点权都乘上一个数 令x,y两点间路径上点的点权都加上一个数 令x,y两点间路径上点的点权都按位取反(~) 查询两点间路径上点的点权之和 所有答案均对$2^{64}$取模 Solut
阅读全文
摘要:Description 给定一个矩阵,要求实现区间修改,区间求和的操作 Solution 二维树状数组的模板题,类比一维,我们依旧利用差分的思想完成。 首先,运用简单的容斥思想,二维前缀和sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j]
阅读全文
摘要:Description 给定一棵树和若干操作,每次可以选取树上任意两点之间的路径染成一种颜色,或是查询任意两点之间路径上有多少段颜色。 Solution 树链剖分不解释,主要分析线段树的维护,在线段树区间上我们维护区间左端的颜色、右端的颜色、整个区间颜色段的数量。那么当我们合并两个区间时,我们首先将
阅读全文
摘要:我们定义f[i][j]表示前j个数组成的长度为i的合法序列的个数,那么有 因此我们不难写出朴素dp的代码 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using nam
阅读全文
摘要:线型dp+线段树优化 我们定义f[i]表示覆盖[L,i]的最小代价,我们将牛按照r递增排列,假设当前牛为[ai,bi],代价为vali 那么存在 我们在状态转移时,每次需要查询区间内的最值,同时f数组发生更新,因此我们可以用线段树的查询、修改在较快时间内维护f数组。 同时我们注意一下边界的处理即可。
阅读全文
摘要:好像跟POJ重题 这是一道扫描线的题。 由于窗口的大小已知,我们不妨换一下思路,把问题转化成这样:平面内有若干个矩形(大小就是窗口的大小,矩形左下角的位置就是某一颗星星的位置),每一个矩形覆盖的区域都有一个权值(星星的亮度),求某一位置,使得这个位置被覆盖的权值最大,最大值即答案。 为什么这样就是正
阅读全文
摘要:线段树扫描线的应用 我们尝试设想有一条无限高的竖线左往右扫过这个并集图形,按照每一个矩形的的左右边界,我们可以将这个并集图形分为2n 段,对于两两相邻的部分,我们可以分别计算面积,这样就得到了整个并集图形的面积。 如图,我们就是把每个矩形的左右边界提了出来,就变成了这样一些线段。 那么我们需要这些量
阅读全文
摘要:线段树+状压 在线段树上维护一个值表示这个区间的颜色,具体地讲,我们将这个区间的颜色进行状压,第1种颜色对应状压后的第1位,以此类推。这样我们维护的这个数就是状压之后的数,在合并区间时将两个数按位或即可,区间取值直接覆盖即可,最后我们统计答案时只需统计这个数有多少个1即可。 1 #include <
阅读全文
摘要:做完这道题,我只想说:爽啊! 这道题的难点在于我们要支持区间赋值、区间翻转、区间最长子序列、区间求和这几种操作。 我们建一棵线段树,维护以下信息:sum区间1的个数max[0/1]区间内0/1最长连续子段lmax[0/1]包含区间左端点最长0/1子段rmax[0/1]包含区间右端点最长0/1子段鉴于
阅读全文
摘要:一道线段树区间合并的问题。 我们需要每次用线段树查找是否存在一个连续的为0的且长度不短与x的子序列、查找完成后需要返回这个子序列的左端点,并且将该子序列全部赋值为1,还需要用线段树完成对一个子序列的赋值。 我们在线段树的每一个节点上维护四个量:tag,sum,l,r分别表示该区间的值(0表示全部为0
阅读全文
摘要:这是一道用线段树维护区间最大子段和的题目 本题的关键在于如何维护区间最大子段和。对于线段树的每一个节点,我们定义四个域:sum,l,r,maxx分别表示这个区间的和、以这个区间左边为起点的最大子段和是多少、以这个区间右边为起点的最大子段和是多少、这个区间的最大子段和是多少。当我们用这个区间的两个子区
阅读全文
摘要:这道题我采用树状数组求解逆序对一类的思想解决 我们读入数据之后,分析问题,本题求解两个问题:‘^’的数量和‘v’的数量,我们先考虑^ 假设我们令i为^的那个顶点,那么以i为顶点的^的个数就是i左侧高度小于i的高度的个数与右侧高度小于i的数量的乘积,我们只需要枚举i的位置,累加答案即可。 我们如何高效
阅读全文

浙公网安备 33010602011771号