数据结构
文章平均质量分 64
dplovetree
华东师大 数据学院在读
展开
-
[Ynoi2016] 镜中的昆虫——浅谈区间种类数问题
这里给出另一种常见的做法:通过将询问离线,把询问挂到区间右端点上,再通过记录每个元素上一次出现的位置,扫一遍序列的同时,用树状数组维护每个左端点到当前右端点。那么想要求区间种类数,一个常见的套路是:区间中所有相同的元素,只有区间中最左边的位置做贡献。个点,一个赋值操作,最多能增加三个点(因为有可能把原本是一段的点,割开了),且每个点最多只能删除一次,那么。的矩形中有多少个点,天哪,多么经典的二维数点问题!那么这个问题中的颜色相同的一段 等于 上个问题中的一个点,从上面的证明我们知道,这是十分经典的问题;原创 2022-09-19 10:32:49 · 513 阅读 · 2 评论 -
2021 Jiangsu Collegiate Programming Contest F. Jumping Monkey II 树剖+线段树
F. Jumping Monkey II题意:给你n=2e5n=2e5n=2e5的一棵树,每个点有点权 a[i]<=1e9a[i]<=1e9a[i]<=1e9,对于每个点,求以这个点出发,并且以自己为 LISLISLIS 的起点 的 最长 LISLISLIS的长度。思路:首先假设一号结点为根,然后每个点作为LIS的起点有三种可能:标注ststst的结点为 LISLISLIS的起点,直线向上代表走父亲,向下代表走子树。圆圈的点,是在 LISLISLIS上的点,不在 LISLIS原创 2022-07-15 08:58:11 · 386 阅读 · 0 评论 -
CF1083C Max Mex
CF1083C Max Mex题意:对于一个非负整数集合 SSS,定义 mex(S)mex(S)mex(S) 为没有在集合 SSS 中出现的最小非负整数。例如,对于非负整数集合 S={0,1,3}S = \{0, 1, 3\}S={0,1,3},没有在集合 SSS 中出现的最小非负整数为 222,因此 mex({0,1,3})=2mex(\{0, 1, 3\}) = 2mex({0,1,3})=2。给定一棵包含 nnn 个结点的树,每个结点对应着一个非负整数 pip_ipi,你需要实现 qqq 次原创 2022-07-15 08:58:26 · 214 阅读 · 0 评论 -
G. Xor-MST Trie树分治
G. Xor-MST题意:给你 2e52e52e5 个点,每个点 的权值小于等于 1e91e91e9;每两个点之间都有连边,边权是 两点权值的异或值,求最小生成树;思路:本来莽了一发 Boruvka,可能是写法问题 MLE了,换了一种分治的写法。考虑将所有点权排序,找到最高位的 使得把 集合分成两个部分,两个部分的集合 分治处理,两个集合 之间的连边 可以用字典树 处理出来,就AC了原理是基于 异或的高位贪心,不仔细讲了吧……#include<bits/stdc++.h>usi原创 2022-04-08 10:33:31 · 165 阅读 · 0 评论 -
2021 ICPC Southeastern Europe Regional Contest E. Replace Sort
E. Replace Sort题意:给你长度为N<=5e5N<=5e5N<=5e5的序列AAA,和大小为5e55e55e5的集合BBB,可以用一次操作 将集合BBB 中的一个元素 覆盖 序列 AAA上一个位置的元素,即 让 A[i]=B[j]A[i]=B[j]A[i]=B[j];问 最小的操作次数,使得 序列AAA变成严格升序。思路:考虑一个很显然的 DPDPDP,dp1[i]dp1[i]dp1[i]表示,最终序列第 iii 位是 A[i]A[i]A[i] 时的最小操作次数;dp原创 2022-03-28 20:34:18 · 845 阅读 · 0 评论 -
GSS2 - Can you answer these queries II
GSS2 - Can you answer these queries II题意:给你1e51e51e5 的序列,每次询问区间l到rl到rl到r,每个相同的数只算一次的最大子段和。思路:乍一眼看上去,是不是没有头绪。对于这种数据结构题,如果在线维护很麻烦的话,可以想想离线的做法!将所有区间离线下来,并按照 rrr 升序排序。那么就可以一个个地加数,考虑维护 一个值DP[l]DP[l]DP[l] 即以lll为左端点到 当前位置的 最大子段和,可以发现,不断地往里面加数字,那么最大字段和,其实就是原创 2022-03-23 20:39:56 · 1913 阅读 · 0 评论 -
#515. 【UR #19】前进四
#515. 【UR #19】前进四题意:给定 1e61e61e6 的序列 aaa,和 1e61e61e6 的操作:第一种操作,将 a[x]a[x]a[x] 改为 bbb;第二种操作,询问 x到nx到nx到n 有多少种后缀最小值。思路:本题有在线的 O(nlog2n)O(nlog^2n)O(nlog2n) 的做法,即维护一种类似DP的东西,然后通过递归线段树 来获得答案,但本文讲的不是这种方法。因为题目中询问的是 后缀最小值,不是区间最小值,所以考虑离线的做法:我们用从序列尾到头的一条扫描线,原创 2022-03-22 22:03:26 · 540 阅读 · 0 评论 -
19 南京区域赛 F. Paper Grading
F. Paper Grading题意:有2e52e52e5个字符串和2e52e52e5个操作;第一种操作是 交换两个字符串;第二种是 给你 l,r,kl,r,kl,r,k 和一个字符串 sss ,询问 区间 l到rl到rl到r 中有多少个字符串的前 kkk个字符 和 sss的前kkk个字符相同。思路:先将所有字符串建成一颗 trietrietrie树,在字符串的结尾位置打个标记。然后 询问下标 l到rl到rl到r之间有多少个字符串 和 sss的前 kkk 个字符相同,就转换成了 询问 trie原创 2022-03-19 11:54:56 · 1064 阅读 · 2 评论 -
18th 省赛 B. Restore Atlantis
题意:有2000∗20002000*20002000∗2000 的二维平面,给你 100000100000100000 个矩形,有 1e51e51e5个询问,每次询问 给你 l和rl和rl和r ,问去掉这个区间的矩形之后,平面中被矩形覆盖的点数。思路1:用扫描线思想,并且用 优先队列的线段树,处理出 二维平面上 所有点,被覆盖的最左边的矩形 和 最右边的矩形。(听说用set会T,可能优先队列的常熟小吧)因为题目的时限只有1s,考虑离线的算法,用树状数组来维护。将所有的询问离线,并按照 rrr升序排序原创 2022-03-09 22:55:37 · 396 阅读 · 1 评论 -
2021 ICPC Asia Taipei Regional Programming Contest C、F
C、Community Service题意:有一个0到1e60到1e60到1e6的数轴,有2e52e52e5次操作:操作一:增加一条 从l到rl到rl到r的线段,每条线段有名字;操作二:给定一个区间SSS 以及范围 l到rl到rl到r,求和SSS有交集的 最近一个被加入的线段TTT,并将TTT从线段集中删去。思路1:如果没有删除线段的操作,那么这道题就是 线段树区间赋值维护最大值,并且区间求最大值。但是有删除操作之后,线段之间的关系就是相互覆盖,很容易想到 可持久化相关的数据结构。我的想法是原创 2022-03-06 12:37:54 · 2064 阅读 · 4 评论 -
Codeforces Round #762 (Div. 3) H Permutation and Queries
H Permutation and Queries题意:给你一个 n(1≤n≤105)n(1≤n≤10^5)n(1≤n≤105) 个数的排列 p,你需要维护以下两种操作:1xy1 x y1xy :交换 pxp_xpx 和 pyp_ypy。2ik2 i k2ik :令 i=pii=p_ii=pi,kkk次后输出iii 。操作数量小于等于 10510^5105。思路:首先分析题目,考虑 从iii 向 pip_ipi 连接一条边,因为数组是排列,所以每个点 只有一条出边和一条入边,那么构成的原创 2022-02-24 15:18:36 · 151 阅读 · 0 评论 -
Codeforces Round #760 (Div. 3) G. Trader Problem
Codeforces Round #760 (Div. 3) G题意:你手里有nnn个物品,第iii个价值为aia_iai。另外mmm个物品,第iii个价值为bib_ibi。你可以把你手里的价值为xxx的物品与不属于你的价值不超过x+kx + kx+k的物品进行交换,交换后原本属于你的物品不再属于你并且可以在新的交换中被换回来,而作为交换,原本不属于你的那个物品现在属于你并且可以被用于新的交换中。现在有qqq次询问,给定kkk,求经过任意次数交换后属于你的物品的价值的最大值。思路一: 自己想的复杂原创 2022-02-23 21:22:04 · 385 阅读 · 0 评论 -
牛客练习赛 93 D (带权并查集+珂朵莉树)
牛客练习赛 93 D题意:带权并查集+珂朵莉树。可以发现,对于第一次操作就是类似,删除原本的这一段区间,再把这一段区间赋一个值。这个操作用珂朵莉树可以很好的实现,毕竟号称 区间赋值小能手。给区间设定四个状态,分别是区间左端点、区间右端点、区间每个位置的兵力、区间所属的单位。对于第一个操作,我们遍历原先在lll ~ rrr内的区间,把原本区间属于的祖先减去这个区间的兵力,再让当前的 ididid 加上这段增援后的兵力。对于占领的情况,只需要在遍历的时候,判断区间的祖先的家是否在 lll ~ rrr原创 2021-12-12 11:11:43 · 316 阅读 · 1 评论 -
Distance on the tree 树上主席树
Distance on the tree题意:给你一颗带边权的树,点数n<=1e5n<=1e5n<=1e5,询问1e51e51e5次,每次询问两个点之间的简单路径,有多少条边权小于等于 K 。思路:第一反应,树剖啊,但是不能加线段树,那么什么能支持区间查询小于等于K的数呢,当然是主席树!复杂度就是O(nlog2nnlog^2nnlog2n)。但是有更好的写法:树上主席树!参考线性主席树利用前缀和的想法,树上主席树也是前缀和的一种, 我们把自己的权值并上父亲的权值,变成一个新的原创 2021-10-19 20:41:30 · 147 阅读 · 0 评论 -
bzoj3188 Upit
题意:思路:类似于线段树维护标记。区间赋值,优先级最高,直接对和进行维护。区间加等差数列就可以把标记设为 :首项和公差,这样区间加等差数列的标记就能合并了。再套平衡树就好了。ops:第一道比赛中做的平衡树的题。因为当时状态比较拉跨,并且区间加等差数列的标记和之前一个线段树加等差数列的平方 的标记搞混了,觉得不能做。知道标记的维护方式,那他就成了裸裸的模板题了。在这里插入代码片#include<bits/stdc++.h>using namespace std;#define原创 2021-08-27 03:08:18 · 126 阅读 · 0 评论 -
杭电中超9 1006 Guess the Weight
Guess the Weight题意:题目就是炉石的猜重量啦,不知道的同学可以先去玩炉石(bushi )题目就是初始给我们一堆牌,我们抽了第一张了之后,可以猜下一张是比第一张大还是小,如果猜对了,就可以获得第二张牌。我们采取最优策略,求能抽中第二张牌的概率。只求概率的话,这道题就不是很难了,但是还有操作是可以往牌堆中加入ccc张权值为aaa的牌。思路:对于每一张牌,如果我们第一张抽它的话,猜的策略肯定是大的多的,或者少的多的。那么可以看做一个有序对(iii,jjj);显然,这个序列有一个分界原创 2021-08-23 22:36:41 · 101 阅读 · 0 评论 -
AC自动机
AC 自动机AC自动机 本人也只做了几道模板题,不太会应用 orz前置知识:KMP、trie树AC自动机适用于多模式串匹配问题,如问几个模式串在文本串分别在文本中出现的次数;首先,多字符串我们建立trie树来减少时间、空间复杂度。其次我们在匹配的过程中,为了达到高效,我们需要再建立一个失配指针,指向深度最深的和当前节点有公共后缀的节点。当我们匹配文本串的时候,我们优先遍历存在的节点,如果没有需要的节点了,我们就跳fail指针继续下去。以上就是普通的,比较简单的AC自动机了。接下来我们来讲重原创 2021-07-30 20:32:10 · 80 阅读 · 0 评论 -
线段树合并——小学六年级必读经典
线段树合并是对于权值线段树来说的。前置知识:权值线段树,动态开点线段树;如果以上两个知识点都还没点亮的话,建议出门右转,我帮你 return( bushi那么我们就发车啦!线段树合并,顾名思义,就是建立一颗新的线段树保留原本两个线段树的信息。考虑 我们合并到线段树a,线段树b的pos位置上:如果a有pos位,b没有,直接return a;如果b有pos位,a没有,直接return b;如果已经合并到叶子节点了,就直接把b上pos位的值加到a的pos位上,return a;递归处理左右子原创 2021-07-23 20:06:09 · 445 阅读 · 0 评论