数据结构
文章平均质量分 94
数据结构类习题总结
Gene_INNOCENT
Wait for the sunrise!
展开
-
详解单调队列算法
前言如果你对这篇文章可感兴趣,可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接。在上一篇文章中,我们介绍了「单调栈」这一最常考察的线性数据结构。而今天我们将继续沿着这个思路,介绍另一个与其 “齐名” 的线性数据结构,即「单调队列」。「单调队列」在「数据结构」题中的分布较为广泛,且常被当作优化「动态规划」的一种重要手段,因此该算法在面试中考察的频率较高,属于必知必会的知识点。队列首先我们来回忆一下「队列」。「队列」是一种「先进先出」的线性数据结构,其中元素原创 2021-03-17 00:25:43 · 7134 阅读 · 10 评论 -
详解单调栈算法
前言如果你对这篇文章可感兴趣,可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接。栈属于基础数据结构之一,基础到仅用「后进先出」这四个字即可完整概括其核心特征。然而,基础并不代表着简单,「后进先出」的背后反而隐藏着多样的变化与极其广泛的应用。在本篇文章中,我们将针对在基础栈上稍加改动所形成的「单调栈」算法进行详解。该算法与「单调队列」组成了算法题中最常考察的线性数据结构,属于面试中必知必会的算法知识。栈首先我们来回忆一下「栈」。「栈」是一种「后进先出」的线原创 2021-03-17 00:19:45 · 7227 阅读 · 9 评论 -
【POJ-2796】Feel Good【单调栈】
题意:给出一个序列,长度为 nnn。定义区间价值为区间和*区间最小值,求出这个序列中的最大区间价值。(n≤105,0≤ai≤106)(n\leq 10^5,0\leq ai\leq 10^6)(n≤105,0≤ai≤106)思路:此题题意十分简洁,求区间价值,并且区间价值定义就是区间和*区间最小值。因此此题最直接的思路就是枚举区间,然后发现 n2n^2n2 算法不可行,然后考虑枚举最小值,...原创 2019-04-05 20:46:19 · 439 阅读 · 0 评论 -
【HDU 5033】【经典单调栈问题】Building
题意:n个人,n栋楼,问每个人往左看,往右看,能够看到的天空的最大角度。【这是一个很经典的单调栈问题】思路: 首先,能够想到将人和楼全部读入栈中进行统一处理。并且左边跑一次单调栈,求出人能够往左看到的最高的楼。右边跑一次,处理出人能够往右看到的最高的楼房。【reverse(a+1,a+1+num)即可换方向再跑一遍】 问题在于如何处理出每个人能够看到的...原创 2018-11-04 00:34:12 · 245 阅读 · 0 评论 -
【Gym - 101234J】Zero Game【单调队列】
题意: 给定一串01串,m次询问,每次询问给你一个数k。k为对于这个01串所能进行的最多次操作,每次操作可以将该串中任意一个位置的数移到任意一个其他的位置。 每次询问之后,输出在这个操作数之内,所能达到的最长的连续0的长度。思路: 一开始考虑的是尺取法进行求解,然后和队友一起debug了一整场...宣告凉凉... 我和队友的...原创 2018-08-31 21:49:18 · 399 阅读 · 0 评论 -
【ACM International Collegiate Programming Contest Gym-100814 C】Connecting Graph【并查集按秩合并】
题意:nnn个点,mmm个操作,操作共两类。① 1 u v①\ 1\ u\ v① 1 u v 表示在图中加一条边连接u、vu、vu、v,② 2 u v②\ 2\ u\ v② 2 u v 表示查询 uuu 与 vvv 最早是在哪一次加边操作后连通,不连通输−1-1−1。 (1≤...原创 2019-05-08 09:00:42 · 1304 阅读 · 0 评论 -
【带权并查集题目汇总】
食物链(POJ 1182):题意: 有 NNN 个动物,编号为 1−N1-N1−N,每个动物都是是A,B,CA,B,CA,B,C 中的一种,但是我们并不知道它们是哪一种。现在给出 KKK 句话,“1 X Y”“1 \ X \ Y”“1 X Y” 表示 XXX 和 YYY 是同类,“2 X Y”“2 \ X \ Y”“2 X&n...原创 2019-03-22 11:19:10 · 1626 阅读 · 0 评论 -
【POJ 1733】Parity game【带权并查集维护奇偶】
题意:一个长度为 NNN 的由 000 和 111 组成的序列 SSS。MMM 个询问,返回 [l,r][l,r][l,r] 中 111 的个数是奇数还是偶数。输出一个最小的 kkk,使得存在一个 010101 序列满足第 1 k−11~k-11 k−1 个回答,但不存在满足第 1 k1~k1 k 个回答的 010101 序列。(N≤109,M≤1000...原创 2019-03-19 22:02:56 · 1309 阅读 · 0 评论 -
【0x40 数据结构进阶 例题】银河英雄传说【带权并查集】
题意:NNN 艘战舰,一开始第 iii 号战舰处于第 iii 列。MMM 条指令,两种形式。① M i j①\ M\ i\ j① M i j ,表示让第 iii 号战舰所在列的全部战舰保持原有顺序,接在第 jjj 号战舰所在列的尾部。② C i j②\ C\ i\ j② C i...原创 2019-03-19 21:34:03 · 237 阅读 · 0 评论 -
【带权并查集详解】以HDU 3038为例【How Many Answers Are Wrong】
带权并查集详解:首先讨论一下带权并查集的主要功能。并查集主要是维护不同元素之间传递关系的数据结构,如果不带权,那么维护的就是不同元素是否属于同一个集合,即连通关系。如果带权,那么除了维护连通性之外,还会维护同一个集合中各个元素之间的关系。对于带权并查集的具体实现,最重要的维护元素是 d[x]d[x]d[x],表示元素 xxx 到根节点 rootrootroot 的偏移量,即 d[x]=x→ro...原创 2019-03-18 12:40:10 · 475 阅读 · 5 评论 -
【POJ 1456】Supermarket【并查集】
题意: 给定N个商品,每个商品利润为pi,过期时间为di,每天只能卖一个商品,过期商品不能再卖,求如何安排每天卖的商品,可以使收益最大。 1 <= N, pi, di <= 10000.思路: 首先有一个很明显的贪心思路。就是将商品按照日期从先到后排序,然后遍历每一个商品,如果当前这个商品过期时间之前的每一天没有全部安排完,那就将这个商品选中...原创 2019-03-13 13:58:39 · 240 阅读 · 0 评论 -
【Gym-100085 E】Eve【模拟题】
题意: 每一个人的线粒体DNA是从母亲那里遗传而来的。给出一个族群的出生和死亡情况,以及某几个人的线粒体DNA测序结果,问在最后时刻,所有活着的人是否拥有相同的线粒体DNA,给出YES、POSSIBLY、NO三种情况结果。 思路: 其实就是一个并查集问题,模拟题目给出的过程,出生时将孩子和母亲放到一个集合中,测序时用map判断是否有相同DNA的人群,将他们放...原创 2019-02-14 23:04:52 · 189 阅读 · 0 评论 -
【HDU - 3038】How Many Answers Are Wrong 【带权并查集 - 向量偏移】
题意: 给定n和m,区间为【1 , n】,m为给出的询问组数。 对于每次询问,将会给出x、y、sum,代表区间【x , y】的累加和为sum。 问一共有几组询问与前面为真的询问不符,如果该组询问不符合事实,请忽略这组询问。 思路: 如果写过 “食物链” 这道题的话,可以很明显地看出这是一个带权并查集问题。而且由于题目给的是区间 sum...原创 2018-08-29 11:12:53 · 208 阅读 · 0 评论 -
【POJ 1182】食物链【“拓展域”并查集】
题意: 有三种动物,A吃B,B吃C,C吃A。 现有K组语句,n个动物,1 x y:x和y是同类,2 x y:x吃y。 符合下列三个条件之一的即为错误语句,输出错误语句个数。1.自己吃自己2.x > n || y > n3.当前语句和之前的正确语句发生了冲突 思路: 本题是拓展域并查集的典型题目,利用拆点,将每一个点拆成...原创 2018-08-28 21:18:16 · 332 阅读 · 0 评论 -
【带权并查集 —— 是否说谎】Parity game【POJ 1733】
题意: 一串由0、1组成的字符串,M次询问,每次询问,小A都会给出一个答案。 每次询问中,有两个数,分别为 l 和 r,然后小A回答在字符串【l,r】这个区间内,有奇数个 1,还是偶数个 1,但是小A会说谎。 问在第 k 组询问中,可以发现小A说谎了,输出最小的 k。思路: 本题有两种做法,一种是用带权并查集来解决该问题,另一种是用扩展域...原创 2018-08-28 19:51:48 · 255 阅读 · 0 评论 -
【带权并查集经典例题】银河英雄传说【同POJ 1988 cube stacking】
题意: 划分为N列的星际战场,各列编号为1,2,...,N。初始每列一艘战舰,第 i 列战舰位于第 i 列。 M条指令,每条指令为以下两种之一:1.M i j,表示让第 i 号战舰所在列的全部战舰保持原有顺序,接在第 j 号战舰所在列的尾部。2.C i j,表示询问第 i 号战舰与第 j 号战舰当前是否在同一列中,如果在同一列中,它们之间间隔了多少艘战舰。 ...原创 2018-08-28 18:59:42 · 321 阅读 · 0 评论 -
【POJ 1456】Supermarket【两种做法】【二叉堆贪心】【并查集】
题意: 给定N个商品,每个商品有利润 pi 和过期时间 di,每天只能卖一个商品,过期商品不能再卖,求如何安排每天卖的商品,可以使收益最大。思路: 先对所有的商品按照时间进行一下排序,再依次将商品加入优先队列,加入优先队列的时候需要进行一下判断:1.当前商品的日期 == 优先队列中的商品数量 && 当前商品的价值大于小根堆堆顶元素的价值...原创 2018-08-27 16:30:37 · 394 阅读 · 0 评论 -
HDU 2144(最长公共子序列+并查集)
今天训练赛的题目,从队切变成个人切的第一场,荣登倒一,很是难受...基础还是太差,以前都靠队友,现在都得自己补了!这题就是对每两个DNA求最长公共连续子序列,然后如果相同部分长度超过一定比例,就将这两个串放到一个集合里.注意点: 1.一开始一直都是TLE,然后发现是再求出了r1=find(i); r2 = find(j); 之后,还将 i 和 j 传进了merge函数,造成了两次调用并查集,...原创 2018-05-13 23:00:18 · 275 阅读 · 0 评论 -
【HDU 5869】Different GCD Subarray Query【区间不同 gcd 个数】
题意:给出 nnn 个数字,一共 qqq 次查询,每次询问一个 lll、rrr,查询区间 [l,r][l,r][l,r] 中有多少个不同的 gcdgcdgcd,其中一个子区间代表一个 gcdgcdgcd。(1≤n,q≤105,1≤ai≤106)(1\leq n,q\leq 10^5,1\leq a_i\leq 10^6)(1≤n,q≤105,1≤ai≤106)思路:区间查询不同 gcdg...原创 2019-09-29 14:11:38 · 1409 阅读 · 0 评论 -
【Gym 102134-E】Kth subtree【权值树状数组、二分统计第k大+dfs离线操作】
题意:给出一棵 nnn 个点的树,一共有 qqq 组询问,每次询问给出vvv、kkk,表示将点 vvv 当做根节点之后,所有节点中子树大小的第 kkk 大是多少。(1≤n≤105,1≤q≤105)(1\leq n\leq 10^5,1\leq q\leq 10^5)(1≤n≤105,1≤q≤105)思路:首先需要观察的是换根之后,哪些节点的子树大小会发生改变。稍微模拟一下就会发现,如果新根...原创 2019-04-15 09:52:37 · 300 阅读 · 0 评论 -
【BZOJ 1103】大都市【dfs序上建立树状数组、维护路径前缀和】
题意:一颗包含 nnn 个节点的树,每条边初始权值为 111。支持两个操作,第一个操作将某一条边的权值变为 000,第二个操作询问从树根到节点 yyy的路径上有多少条权值为 111的边。思路:这题对于树链剖分来说是一道裸题,但没必要。由于只求从根节点到节点 xxx 上经过的所有边中有几条非 000 边,因此我们可以考虑一下维护前缀和。首先我们可以发现点 AAA 与它子树中所有节点的 df...原创 2019-03-17 09:03:39 · 212 阅读 · 0 评论 -
【BZOJ-1095】[ZJOI2007] Hide 捉迷藏【线段树维护树直径】
题意:nnn 个点的一棵树,每个点初始为 000,支持两种操作,第一种操作 C xC \ xC x,表示将第 xxx 个点取反,即 111 变 000,000 变 111。第二种操作为 GGG,表示查询两个相距最远的 000 点距离。(1≤n≤105,1≤m≤5∗105)(1\leq n\leq 10^5,1\leq m\leq 5*10^5)(1≤n≤105,1≤m≤5∗1...原创 2019-09-22 20:45:16 · 1474 阅读 · 0 评论 -
【2018宁夏邀请赛 L】Continuous Intervals【线段树】
题意:nnn 个数的一个序列,对于一个连续区间,将这个区间内的数排序,相邻数字差距小于等于 111,则这个区间符合条件。问这个序列中有多少个符合条件的连续区间。(1≤n≤106)(1\leq n\leq 10^6)(1≤n≤106)思路:这是一个区间计数问题,即询问一个序列中符合条件的区间个数。通常此类问题的思考方向是确定一个左端点,求有多少个符合条件的右端点。或者确定一个右端点,求有多少...原创 2019-08-31 17:48:39 · 1554 阅读 · 1 评论 -
【 2019中国大学生程序设计竞赛(CCPC) - 网络选拔赛】1002.array【主席树】
题意:给定一个长度为 nnn 的序列,序列中每个数都不相同,数字范围在 1 n1~n1 n 之间,一共有 mmm 次操作。操作 111,(1,pos)(1,pos)(1,pos),令 apos=apos+107a_{pos}=a_{pos}+10^7apos=apos+107。操作 222,(2,r,k)(2,r,k)(2,r,k),求出大于等于 kkk 且不等于 a1&...原创 2019-08-23 20:35:38 · 300 阅读 · 0 评论 -
【2019牛客暑期多校训练营(第八场)E】Explorer【线段树分治维护图连通】
题意:nnn 个点,mmm 条边,每条边有一个区间 [li,ri][l_i,r_i][li,ri],表示只有体重在这个范围内的人才能通过这条边,问有多少种不同的体重可以从起点到达终点。(1≤n,m≤105,1≤li,ri≤109)(1\leq n,m\leq 10^5,1\leq l_i,r_i\leq 10^9)(1≤n,m≤105,1≤li,ri≤109)思路:这应该是一类经典...原创 2019-08-14 21:10:27 · 183 阅读 · 0 评论 -
【2019牛客暑期多校训练营(第七场)E】Find the median【权值线段树】
题意:初始序列为空。一共 NNN 次操作,每次操作往序列中加入区间 [L,R][L,R][L,R] 中的所有数。每次操作结束后询问当前序列中的中位数。(1≤N≤4∗105,1≤L≤R≤109)(1\leq N\leq 4*10^5,1\leq L\leq R\leq 10^9)(1≤N≤4∗105,1≤L≤R≤109)思路:涉及到了中位数,因此不难想到权值线段树。但是每次是对一个区间 +1...原创 2019-08-14 18:27:40 · 1343 阅读 · 1 评论 -
【Codeforces Round #546 (Div. 2) E】Nastya Hasn't Written a Legend【线段树】
题意:给定长度为 nnn 的数组 aaa 和长度为 n−1n-1n−1 的数组 kkk。支持两种操作,操作 111,aia_iai 增加 xxx,且如果 ai+1<ai+kia_{i+1}<a_i+k_iai+1<ai+ki,ai+1=ai+kia_{i+1}=a_i+k_iai+1=ai+ki,循环往后。操作 222,查询区间 [L,R][L,R...原创 2019-08-03 19:56:39 · 1266 阅读 · 0 评论 -
【2019南昌邀请赛网络赛 B Greedy HOUHOU & BZOJ 2957 楼房重建】线段树+二分
BZOJ 2957 楼房重建题意:一个长度为nnn的序列,有mmm个操作。操作分为两类,① 令a[x] = y ② 查询全局的递增序列,能选就选。(1≤n,m≤105)(1\leq n,m\leq 10^5)(1≤n,m≤105)思路:线段树节点维护maxnmaxnmaxn与sumsumsum,sumsumsum表示该节点对应区间的递增序列值之和,maxnmaxnmaxn表示该节点对应区间节点...原创 2019-04-24 11:06:02 · 429 阅读 · 0 评论 -
【BZOJ 3531 Sdoi2014】旅行【动态开点线段树+树链剖分】
题意:现在有 nnn 个城市,构成了一颗树。每个城市都有自己信仰的宗教,以及城市评级。现在一共有四种操作:①①① 某个城市改信 ccc 教②②② 某个城市的评级调整为 www③③③ x−&amp;gt;yx-&amp;gt;yx−&gt;y 路径上所有与 xxx 信仰相同的城市的评级之和④④④ x−&amp;gt;yx-&amp;gt;yx−&gt;y 路径上所有与 xxx 信仰相同的城...原创 2019-03-16 13:50:50 · 222 阅读 · 0 评论 -
【线段树】Interval GCD【线段树维护gcd】
题意: 长度为N的数列A,以及M条指令(N、M <= 2*1e5),每条指令可能是以下两种之一: 1.“C l r d”,表示把 A[l],A[l+1],...,A[r] 都加上d。 2.“Q l r”,表示询问A[l],A[l+1],...,A[r]的最大公约数(GCD)。 对于每个询问,输出一个整数表示答案。...原创 2018-10-31 10:22:31 · 878 阅读 · 4 评论 -
【POJ 2482】【扫描线问题】Stars in Your Window【包星星问题】
题意: 给出一大堆星星的坐标,给出每个星星的亮度。然后给出一个矩形,要求用这个矩形包住的星星的亮度最大。注意:如果星星在矩形边界上,则不计算这个星星的亮度。【ps:本题的description是一封极美的情书,文采非常棒,强推!】 思路: 我们来思考一下,一个矩形的位置是不是由这个矩形右上角这个点所决定的,所以我们可以把考虑矩形的位置改为考虑右上角这个点所在...原创 2018-10-20 17:25:04 · 194 阅读 · 0 评论 -
【扫描线】【POJ-1177】Picture【周长并】
题意: 给一堆矩阵,求出所有矩阵拼起来,求出矩阵并起来的总周长。思路: 其实与面积并差不多,就是求ans的时候,ans += abs(last-t[1].len),每次插入一根线段,对答案的贡献值为使得t[1].len增加或减少的长度。 可以自己画个图模拟一下,就可以明白这么做的原因。代码:#include <cstd...原创 2018-10-20 14:29:03 · 237 阅读 · 11 评论 -
【HDU1255】【扫描线 —— 矩形面积交】覆盖的面积
题意: 本题是扫描线的典型应用,就是求矩形的面积交。与本题相关的题就是HDU1542,求矩形面积并。 思路: 我们先来讨论一下扫描线的本质。扫描线算法其实就是先将所有的 y 坐标进行离散化,然后用所有离散的点建立一棵线段树,这棵线段树的每一个节点的左右端点就代表空间中 y 坐标上的一段区间。 然后我们再将每一个矩形的左右两条边抽出来,进行排序,然后...原创 2018-10-19 20:41:34 · 464 阅读 · 0 评论 -
【BZOJ 1503】郁闷的出纳员【权值线段树】
前期知识: 权值线段树本质 —— 每个节点存取的是一个区间内的信息,即在 [l,r] 这个区间内的信息,而普通的线段树可能是维护区间内的最大值,sum和之类的信息。 当数据范围比较大,但是数据个数不多的时候,可以使用离散化实现权值线段树。 权值线段树可用于求取全局第 k 大之类的信息。 题意: 建立员工档案,要求支持动态加...原创 2018-10-17 19:14:55 · 514 阅读 · 0 评论 -
【POJ-2452】Sticks Problem【二分右端点+线段树】
题意: 给定一个数组序列,找到一段区间 [ i , j ],使得区间a[i] < a[k] < a[j],( k 是 [ i , j ] 中任意一个数),此处注意 a[i] 是区间唯一最小值,a[j] 是区间唯一最大值。 求 j-i 最大值。(n <= 50000) 思路: 确定左端点,然后找到一个最长区间,使得该区间的最小值为左...原创 2018-10-10 20:07:46 · 279 阅读 · 0 评论 -
【Gym - 101234A】Hacker Cups and Balls【线段树 + 二分答案】
题意: 给定一个数组,一共有n个元素,分别为1-n中所有数,给定m次操作,每次给出 ( l , r ) ,表示对区间 ( l , r ) 内的元素进行升序排序或者降序排序,操作结束之后询问数组最中间的那个数是多少。 思路: 一开始看到这道题的时候,毫无思路......是赛后补的题。 题目思路就是对最中间那个数进行二分,二分答案来求解。在...原创 2018-09-03 21:09:40 · 565 阅读 · 0 评论 -
POJ 3667 Hotel (线段树区间合并)
题意: 有一个旅馆,对于入住的人,输出连续房间的第一个房号,使房号尽量靠前;对于离开的人,将他们的房间重新标记为没有人住。思路: 对于这个问题,需要维护三个信息,①区间内最大连续空房间 ②区间内紧靠左端点的最大连续空房间③区间内紧靠右端点的最大连续空房间 采用延迟标记,用loop来标记房间状态,loop == 1:没人住 loop == 2:...原创 2018-05-26 11:02:20 · 169 阅读 · 0 评论 -
HDU 1394 求逆序数(线段树)
题意: 给一个初始数列,不断将数列第一个数移到最后,求下述n个数列中逆序数最少是多少?思路: 题目数据水,可以暴力n^2卡过去 正经做法:用线段树求逆序数,求解过程 注意:本题给出的n个数为0-n-1的数,每个数不重复然后求出初始序列的逆序数之后,就可以观察数列结构,给出递推公式:sum =sum +(比这个数大的数)-(比...原创 2018-05-26 10:55:01 · 227 阅读 · 0 评论 -
【2018-2019 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) F】Rectangles【扫描线】
题意: 给出n个矩形,求被覆盖区域为奇数次的总面积。思路: 扫描线有很多种写法,可以打lazy更新到底,也可以不打lazy,只是单纯对目标边进行更新,然后再区间合并上去。 本题问的是被覆盖区域为奇数次的总面积。因此线段树每个节点记录被覆盖的次数,被覆盖奇数次的长度,被覆盖偶数次的长度。每次加入一条边,只对被覆盖的那个最大的区间,覆盖次数+1...原创 2019-03-03 11:33:56 · 567 阅读 · 3 评论 -
【2019南京icpc网络赛 I】Washing clothes【李超树】
题意:给出 nnn 和 yyy,表示 nnn 个人以及手洗的时间为 yyy,以及 nnn 个 tit_iti,表示每个人达到洗衣房的时间。每个人可以选择手洗或者机洗,但只有一个洗衣机,问对于机洗时间为 xxx 时的最大时间,输出 xxx 为 1~y1~y1~y 时的答案。(1≤x≤y,1≤n,y≤106,0≤ti≤109)(1\leq x\leq y,1\leq n,y\leq 10^6,0\...原创 2019-09-01 21:44:28 · 644 阅读 · 13 评论