随笔分类 - 数据结构
1
摘要:题意 给定一棵树,点权为 的排列。每次交换两个点的点权或者询问整棵树上所有路径中,路径上点权的 最大值。 Solution 比较神奇的转化。 考虑放宽题目中的限制,我们在区间 维护树上路径中包含 的数的
阅读全文
摘要:题意 给定一张图,边权为 ,求 到 的最短路以及方案。 Solution 直接上最短路!现在的问题是如何高效存储路径上权值的加和。这题有个特殊之处就是边权都是二的整次幂,我们需要一个有效的方式来实现手动二进制进位并且能够保证时空复杂度。 这题我们利用线段
阅读全文
摘要:题意 给定一张无向图,点有点权。每次可以修改一个点的点权,或者询问从 到 所有不经过重复点的路径上最小的点权是多少。 Solution 考虑一个点双,点双中任意两个点之间都有两条以上的不同路径,换句话说,对于一个点双,我从任意点出发到任何异于起点的点去,总能取到点双中点权最小的点。这
阅读全文
摘要:题意 你是一个狼人。每次询问给出起点和终点,表示你要从城市 走到城市 。不幸的是,你一开始是个人,最后是只狼,并且在作为人的时候,你不能进入编号为 的城市;同样在作为狼的时候,你不能进入编号为 的城市。如果你可以自由选择在路径
阅读全文
摘要:题意 数轴上有 个村庄,现在可以建立不超过 个基站,对于一个村庄,如果在不超过 的范围内有基站,那么它就是被覆盖的。在村庄 建立一个基站需要花费 。如果一个村庄 没有被覆盖,那么就需要付出 的代价,求最小代价和。 Solution 要
阅读全文
摘要:题意 给定一张无向图,每次询问为更改一条边的边权后,从 到 的最短路。 Solution 首先考虑有哪些情况。如果原图中 的最短路为路径 ,其上第 个点为 。 删去的边在 上,且边权变大; 删去的边在 上,且边权变小; 删去的
阅读全文
摘要:这是一种比较常见的数据结构技巧,所以单独开一个坑。 概论 看上去很高端,实际上就是解决矩形求和的问题,有的时候还支持修改。 使用这种技巧有一个重要的前提:离线! 二维数点 首先这个技巧可以很好地解决二维数点问题。我们可以先来总结一下有哪些问题可以转化成二维数点问题,总的来说,如果一个序列上的问题可以
阅读全文
摘要:题意 有 种物品,每个物品有价格 ,品质 。对于一个来购买的人,有 元,他可以购买多次,每次选择买得起的所有物品中选取品质最高的买,若有多个品质相同的会买最便宜的。求能购买多少次。总共会有 个人。 Solution 首先考虑如果只有一个人,你显然可以把物品
阅读全文
摘要:题意简述 求一个长度为 的括号串的不同合法括号串的个数。。 Solution 真是 SAM 白学了呢…… 看到题目中要求本质不同的子串,那肯定是除了 SAM 没有人能够胜任了。然后考虑到括号串判断合法直接做比较麻烦,所以根据后缀自动机的性质,我们希望能够
阅读全文
摘要:题意 给一段带颜色的序列,每种颜色有特定的权值。求一个 ,使得只出现一次的颜色的权值和最大。 Solution 教我! 这题的套路好像挺经典的样子。假如说我们把左端点当成行,右端点当成列,那么我们考虑一个区
阅读全文
摘要:题意 给一棵树,在给定的 条带权边中选出若干条,使得每一个点最多包含于一个环。求选边的最大权值和。 Solution 相当于可以覆盖树上一条路径来获得特定价值。好吧真的是大炮题。 考虑定义 表示在以 为根的子树中进行合法的覆盖所能得到的最大权值和。于是你考虑对于一条路径
阅读全文
摘要:题意 给定一个长度为 的序列 。求有多少个子区间满足存在一个数,在该区间内出现的次数超过区间一半。 Solution 考虑转化题意,如果我们尝试枚举这个出现次数超过一半的数字是 ,则我们将 令作 ,不等于 令作 。那么对于当前以 为超过一半的
阅读全文
摘要:题意 求区间最大去重后的子段和。 Solution 考虑到 CF997E 的套路。求区间子段计数的问题,可以采用离线的方式。还是一样考虑移动右端点。那么在线段树上 位置存储 的去重后的子段和。 现在考虑端点移动。加入了一个 ,只会对上一次出现 的位置之后
阅读全文
摘要:大意 给你一个初始字符串。现在需要你实现两种操作,第一种是在字符串最后插入字符,第二种是给出一个字符串,求这个字符串在整个字符串中出现的次数。强制在线。 Sol 牛逼题啊。首先对于动态插入字符的问题,别的算法肯定是行不通的(可能哈希可以搏一搏),所以我们考虑十分贴合这题的 SAM。SAM 本身就是采
阅读全文
摘要:前言 发现至今没有系统地学过莫队。。。 普通莫队一般人都会,就一分块暴力。 题单 以及 dx 的训练题单 以及 dx 的双倍经验题单。 奇怪的碎碎念 本文的题目基本来自于上面的题单,文末的 Tasks 模块是trashbin前面每个模块里看起来比较综合或者难写的题。相当于作业?以及只有板子题和困难题
阅读全文
摘要:前言 这太难了啦~但是冬令营讲这个东西了,提前开坑。前置芝士 Define #define ls tr[x].ch[0] #define rs tr[x].ch[1] struct Tree{int ch[2],val,fa,rev,xv;}tr[MAXN]; LCT? LCT 是怎么超越一般的树剖
阅读全文
摘要:前言 又是每个人都会的算法,我不会只能爬去学~ 点分治 点分治通常用来解决树上路径统计问题。 其实点分治的想法很简单就是:我们考虑一棵有根的树,显然可以将其路径分成两类,一类是经过根的,一类是不经过根的。据此,可以得到一个牛逼想法就是:对于当前的根节点,直接求出它到子树内各个点的信息并统计,然后合并
阅读全文
摘要:前言 好像机房人人都会这个东西,就我不会,只能爬去学一下。。。 这是啥 好像是个挺没用的东西,感觉主要处理树上数数什么的问题,都可以用 dsu 神器来替代。但也有的问题不能用 dsu 的,比如这题。 来考虑这样一件事,就是说,我们有的时候希望对于每个点都维护一棵线段树,并且希望能够实现一些鬼畜的♂操
阅读全文
摘要:前言 前几天有幸听学长讲平衡树,想着好久没写博客了,记录一下。 简介 Splay,平衡树的一种,依靠每次将访问到的点旋到根来保持树的平衡。 并且,Splay 还可以高效解决序列翻转等操作。 实现 前提 以下代码是基于这样的定义的: struct Tree{int ch[2],val,siz,fa;}
阅读全文
1