05 2019 档案

摘要:线段树扫描线的应用 我们尝试设想有一条无限高的竖线左往右扫过这个并集图形,按照每一个矩形的的左右边界,我们可以将这个并集图形分为2n 段,对于两两相邻的部分,我们可以分别计算面积,这样就得到了整个并集图形的面积。 如图,我们就是把每个矩形的左右边界提了出来,就变成了这样一些线段。 那么我们需要这些量 阅读全文
posted @ 2019-05-31 23:34 AD_shl 阅读(305) 评论(0) 推荐(0)
摘要:线段树+状压 在线段树上维护一个值表示这个区间的颜色,具体地讲,我们将这个区间的颜色进行状压,第1种颜色对应状压后的第1位,以此类推。这样我们维护的这个数就是状压之后的数,在合并区间时将两个数按位或即可,区间取值直接覆盖即可,最后我们统计答案时只需统计这个数有多少个1即可。 1 #include < 阅读全文
posted @ 2019-05-26 10:58 AD_shl 阅读(253) 评论(0) 推荐(0)
摘要:做完这道题,我只想说:爽啊! 这道题的难点在于我们要支持区间赋值、区间翻转、区间最长子序列、区间求和这几种操作。 我们建一棵线段树,维护以下信息:sum区间1的个数max[0/1]区间内0/1最长连续子段lmax[0/1]包含区间左端点最长0/1子段rmax[0/1]包含区间右端点最长0/1子段鉴于 阅读全文
posted @ 2019-05-25 20:11 AD_shl 阅读(266) 评论(0) 推荐(0)
摘要:一道线段树区间合并的问题。 我们需要每次用线段树查找是否存在一个连续的为0的且长度不短与x的子序列、查找完成后需要返回这个子序列的左端点,并且将该子序列全部赋值为1,还需要用线段树完成对一个子序列的赋值。 我们在线段树的每一个节点上维护四个量:tag,sum,l,r分别表示该区间的值(0表示全部为0 阅读全文
posted @ 2019-05-25 14:42 AD_shl 阅读(173) 评论(0) 推荐(0)
摘要:一道感觉不错的并查集的题目 我们先将每一组矛盾关系按照冲突值从大到小排序,然后顺序扫描一遍,让冲突值大的两个人尽可能不在一个监狱里,如果不能满足,那么答案就是这组关系的矛盾值。如果所有的矛盾都不会发生,那么答案就是0. 之后我们建立并查集,另外定义一个辅助的数组d表示每一个人的一个敌人。我们扫描每一 阅读全文
posted @ 2019-05-25 12:52 AD_shl 阅读(211) 评论(0) 推荐(0)
摘要:这是一道用线段树维护区间最大子段和的题目 本题的关键在于如何维护区间最大子段和。对于线段树的每一个节点,我们定义四个域:sum,l,r,maxx分别表示这个区间的和、以这个区间左边为起点的最大子段和是多少、以这个区间右边为起点的最大子段和是多少、这个区间的最大子段和是多少。当我们用这个区间的两个子区 阅读全文
posted @ 2019-05-25 00:19 AD_shl 阅读(494) 评论(0) 推荐(0)
摘要:这道题我采用树状数组求解逆序对一类的思想解决 我们读入数据之后,分析问题,本题求解两个问题:‘^’的数量和‘v’的数量,我们先考虑^ 假设我们令i为^的那个顶点,那么以i为顶点的^的个数就是i左侧高度小于i的高度的个数与右侧高度小于i的数量的乘积,我们只需要枚举i的位置,累加答案即可。 我们如何高效 阅读全文
posted @ 2019-05-24 23:18 AD_shl 阅读(312) 评论(0) 推荐(0)
摘要:这道题可以用Splay、fhq-treap解决,但是平衡树解这道题大材小用,所以我采用了对顶堆解决。 考虑建立两个堆:以i为分割点,用大根堆存储前半段序列,用小根堆存储后半段序列。我们控制大根堆的元素个数为i,这样查询时大根堆的堆顶就是排名为i的元素。然后我们考虑维护对顶堆。 对于add操作,我们先 阅读全文
posted @ 2019-05-18 21:35 AD_shl 阅读(222) 评论(0) 推荐(0)
摘要:“二维”单调栈的题目,一上来有点没有思路,想用dp做一下,然而转念一想,假设我们把这个图按照行进行划分,先处理前1行的最大矩形,在处理前2行的最大矩形,再处理前3行的最大矩形……最后用子问题的答案更新答案即可。这样一来,这个问题就转化成了一个简化版单调栈的题目。 简化版点这里,所以,我们采用这种思路 阅读全文
posted @ 2019-05-18 15:18 AD_shl 阅读(334) 评论(0) 推荐(0)
摘要:一道关于单调队列的模板题。 题目要求求一段区间,使得这一段区间的和最大且区间长度不超过m。我们显然想到了先求出这个序列的前缀和sum,这样我们就能用O(1)的时间查询任意一个子序列的和。 现在,我们枚举区间的右端点,对于每一个右端点i,我们要找到一个左端点j,使得sum[j]最小而且i-j≤m. 因 阅读全文
posted @ 2019-05-18 09:42 AD_shl 阅读(220) 评论(0) 推荐(0)
摘要:一道鬼畜的题目,洛谷给的标签是紫题,怎么可能是紫题…… 原本我想找出在起点到终点的路径上的割点,但是看到了这良心的数据之后…… 由于数据很小,所以我们枚举中间点,然后进行一遍dfs,判断不经过这个中间点这张图是否联通即可。 这就能过?? 是的……时间复杂度为O(n2) 1 #include <ios 阅读全文
posted @ 2019-05-04 10:39 AD_shl 阅读(237) 评论(0) 推荐(0)
摘要:这是tarjan求割点的模板题,在此tarjan算法不在赘述,主要讲一些易错点。 首先这张图不一定是连通图,所以我们不能直接从1开始dfs 注意tarjan算法中的一些细节。 注意输出格式!!! 1 #include <iostream> 2 #include <cstdio> 3 #include 阅读全文
posted @ 2019-05-04 10:10 AD_shl 阅读(148) 评论(0) 推荐(0)
摘要:这道题是在基本的tarjan求割点的算法上进一步加深,加上了计数问题。 基本思路是显然的,我们必定要跑一遍tarjan求割点,之后我们就要分类讨论。 若这个点不是割点,那么把他的边去掉之后这个点就与原来的联通块分开了,一共有(n-1)对,因为(x,y),(y,x)算两对,所以答案为n-1<<1 若这 阅读全文
posted @ 2019-05-04 09:45 AD_shl 阅读(121) 评论(0) 推荐(0)
摘要:这是一道树链剖分/树上差分/LCA的题目…… 本来想打一遍树剖,但是被那强大的码量劝退了,于是我开始思考树上差分。 我们先把每个点深度的k次方打一个表,之后我们因为要做减法,所以我们令vali,k​表示i到1号点路径上点深度的k次方之和 然后问题来了,我们维护的是点权和,所以我们发现直接减的话会导致 阅读全文
posted @ 2019-05-03 15:40 AD_shl 阅读(154) 评论(0) 推荐(0)
摘要:这道题说每一步可以走2k个距离,那么这道题就直接和倍增建立了联系。 由于n的范围很小,我们可以用Floyd处理边的关系,定义vis[i][j][k]表示ij之间是否存在2k的路径,dis[i][j]表示ij之间的最短距离是多少。 我们可以先进行一次Floyd处理vis,枚举ij以及中间点k,若vis 阅读全文
posted @ 2019-05-03 14:36 AD_shl 阅读(125) 评论(0) 推荐(0)
摘要:一道“扩展域”并查集的题目,我们把每一个点拆分成三个域:同类、食物、天敌。 我们假设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是同类。 阅读全文
posted @ 2019-05-02 22:56 AD_shl 阅读(365) 评论(0) 推荐(0)
摘要:这是一道带权并查集的题目。 我们维护三个数组,f[x]表示节点x所在集合的代表元素(相当于合并之后的树根),size[x]表示以x为代表元素的集合的大小是多少(相当于一列战舰的数量),d[x]表示在这一列战舰中,x前面的战舰有多少。 因此对于每一次询问,答案就是|d[x]-d[y]|-1. 我们怎样 阅读全文
posted @ 2019-05-02 22:33 AD_shl 阅读(261) 评论(0) 推荐(0)
摘要:一道经典的贪心题。 我们不妨将物品按照价值从大到小排序,对于每一个物品,我们尽量让它晚一些被售出,这样得到的答案一定是最优解。 我们可以简单证明一下,首先我们先售出获利较大的物品,这个的正确性是显然的。对于某一个物品,我们最好在时间范围之内让它最晚被售出。为什么呢?因为这个物品在允许范围内的任意时间 阅读全文
posted @ 2019-05-02 22:11 AD_shl 阅读(160) 评论(0) 推荐(0)
摘要:读完题,我产生了一个显然的想法:先求出这张图的最大生成树,然后再dfs一遍求出联通块的个数(图可能不连通),之后这张图变成了一棵树,题目就变成了在一棵树上给定一条路径,求这条路径上最小的边权是多少。(-1的情况可以通过并查集直接判断)。 考虑一条路路径(x,y),我们可以把它拆分成(x,lca(x, 阅读全文
posted @ 2019-05-02 15:27 AD_shl 阅读(262) 评论(0) 推荐(0)
摘要:这是一道毒瘤的LCA的题目。 我们对这棵树进行一次dfs,求出每一个点的时间戳,不难发现,我们按照时间戳排序,把异象石的节点排序,并且累加相邻两点的路径,最后的结果就是所求答案的两倍。 因此,我们采用STL中的set,按照时间戳递增的顺序维护异象石出现的序列,并用变量ans记录相邻两点的距离之和,那 阅读全文
posted @ 2019-05-02 13:31 AD_shl 阅读(313) 评论(0) 推荐(0)
摘要:关于lca和树上差分的题目。 根据题目描述,主要边是一棵树,附加边会和主要边构成一个环,如果我们第一步切断了一条主要边,我们下一步就必须切断一条附加边才能符合题意。 所以,我们可以认为一条附加边(x,y)把树上x,y之间的路径覆盖了一遍,我们需要统计每条主要边被覆盖多少次即可。具体地,如果第一步我们 阅读全文
posted @ 2019-05-01 19:34 AD_shl 阅读(130) 评论(0) 推荐(0)
摘要:这是一道关于树的直径的好题,值得一刷。 本题有两个难点,一个是分类讨论k,另一个是代码的实现(其实还好)。 本题k可以为1或2,因此我们分类讨论一下。 当k=1时,我们可以任选两个点连接,假设我们一条边都不连接,那么我们需要走2*m次,其中m为边的数量。假设我们在x,y上连一条边,那么我们用1个距离 阅读全文
posted @ 2019-05-01 14:33 AD_shl 阅读(198) 评论(0) 推荐(0)