线段树
文章平均质量分 75
segment tree
逍遥Fau
为伊蕾娜献上心脏!
展开
-
HDU4638 Group (莫队 / 询问离线+线段树)
题目链接: Group大致题意有一个长度为nnn的111~nnn排列, 保证序列中没有相同的元素. 有mmm次询问, 每次询问[l,r][l, r][l,r]中所有的元素可以分成多少个不相交的线段.解题思路解法一: 莫队我们考虑用莫队去维护[l,r][l, r][l,r]的信息. 设当前位置为pospospos, 元素值为valvalval. 如果val+1val + 1val+1和val−1val - 1val−1均出现过, 则答案−1-1−1. 否则, 若二者均未出现, 则答案+1+1+1.原创 2021-11-17 08:54:52 · 436 阅读 · 0 评论 -
Codeforces915E Physical Education Lessons (线段树 + 区间离散化)
题目链接: Physical Education Lessons大致题意给定一个长度为nnn的010101序列, 有两种操作: 把区间[l,r][l, r][l,r]全部变为111, 或把区间[l,r][l, r][l,r]全部变为000.每次操作结束后, 输出序列中111的个数.解题思路➡️题目弱化版推荐⬅️线段树我们考虑到如果nnn比较小(在10610^6106以内), 我们可以直接用线段树暴力维护区间信息.但是本题的nnn很大(有10910^9109), 我们没法通过堆存储的方式用静原创 2021-11-15 18:15:52 · 480 阅读 · 3 评论 -
P4137 Rmq Problem / mex (三种解法: 权值线段树+询问离线 / 可持久化线段树 / 莫队+值域分块)
题目链接: P4137 Rmq Problem / mex大致题意给定一个长度为nnn的序列, 有mmm次询问操作.每次询问[l,r][l, r][l,r]区间的mexmexmex是多少.解题思路解法一: 权值线段树 + 询问离线我们考虑把所有的询问按照右端点rrr从小到大排序, 用权值线段树维护[1,r][1, r][1,r]区间中所有数值最后一次出现位置的最小值.对于询问区间[l,r][l, r][l,r], 我们在树上进行二分, 如果当前值域左区间的最小出现位置要小于lll, 则访问左区原创 2021-11-11 19:03:14 · 485 阅读 · 1 评论 -
HDU3308 LCIS (线段树区间合并)
题目链接: LCIS大致题意给定一个长度为nnn的序列. 有mmm次操作:U a c 把第aaa个位置的数字修改为ccc.Q l r 询问[l,r][l, r][l,r]的最长连续严格递增子序列(下文用LCIS代替).特别的, 题目下标从000开始.解题思路线段树 (超经典, 在做树上LCIS时过来验了下pushup)我们可以通过线段树的区间合并来解决本类题目:考虑当前有两个区间left,rightleft, rightleft,right. 设合并后的新区间为resresres.那原创 2021-11-10 09:23:40 · 416 阅读 · 0 评论 -
HDU6562 Lovers (线段树 懒标记下放)
题目链接: Lovers大致题意给定nnn个字符串, s1,s2,…,sns_1, s_2, …, s_ns1,s2,…,sn 初始均为空串.有mmm次如下操作:warp l r d: 其中ddd是一个数字字符, 表示对s[l:r]s[l:r]s[l:r]的所有字符串开头和结尾都加上字符ddd.query l r 询问∑i−lrvalues(si)\displaystyle \sum_{i - l}^{r}values(s_i)i−l∑rvalues(si). 其中values(str)原创 2021-11-09 20:26:30 · 121 阅读 · 0 评论 -
HDU6992 Lawn of the Dead (线段树)
题目链接: Lawn of the Dead大致题意给定一个n×mn \times mn×m的网格, 你初始位于(1,1)(1, 1)(1,1), 你只能向下或向右走.网格中有kkk个地雷, 地雷所在的格子是不能去的.问: 你最终可以到达多少个不同的方格?解题思路思维我们考虑到n,mn, mn,m的值域太大了, 我们是无法模拟出所有过程的.考虑到只能向右或向下走, 因此我们可以这样思考: 设有一个长度为mmm的数组vis[]vis[]vis[], 表示第i−1i - 1i−1行的所有位置原创 2021-10-26 16:39:51 · 126 阅读 · 0 评论 -
智乃酱的平方数列 (线段树维护三阶前缀和 / 线段树维护二次函数)
题目链接: 智乃酱的平方数列大致题意给定一个长度为nnn的序列, 有mmm次如下操作:1 l r 表示对区间[l,r][l, r][l,r]加上一个如{1,4,9,16,...,len2}\{ 1, 4, 9, 16, ..., len^2 \}{1,4,9,16,...,len2}的平方数列2 l r 表示询问区间[l,r][l, r][l,r]的和.解题思路➡️如果你还不了解高阶前缀和, 请点击这里⬅️线段树我们只需要用线段树维护三阶前缀和即可.AC代码#include <b原创 2021-10-20 19:27:46 · 625 阅读 · 0 评论 -
2021ICPC网络赛第2场 Euler Function (势能线段树 + 欧拉函数)
题目链接: Euler Function (进入教育商店后可购买)大致题意给定长度为nnn的序列, a1,a2,a3,...,ana_1, a_2, a_3, ..., a_na1,a2,a3,...,an, 有mmm次操作:0 l r c 给[l,r][l, r][l,r]区间上的每个数乘ccc.1 l r计算∑i=lrϕ(ai) mod 998244353\displaystyle \sum_{i = l}^r \phi(a_i) \ mod\ 998244353i=原创 2021-10-19 22:45:43 · 239 阅读 · 0 评论 -
牛客挑战赛39 牛牛的等差数列 (线段树 / 树状数组) (等差数列 高阶差分 高阶前缀和)
题目链接: 牛牛的等差数列大致题意给定一个长度为nnn的序列, 有mmm次如下操作:1 l r k d 表示对区间[l,r][l, r][l,r]加一个首项为kkk, 公差为ddd的等差数列.2 l r md 表示询问区间[l,r][l, r][l,r]的和, 并对mdmdmd取模.解题思路首先, 推荐这个题目的弱化版, 区间修改, 单点查询 ➡️ 题目弱化版点这里!!!⬅️本题的mdmdmd取值是位于[3,25][3, 25][3,25]之前的素数, 数值乘积大概为10810^8108,原创 2021-10-18 09:43:58 · 802 阅读 · 5 评论 -
P1438 无聊的数列 (三种解法 线段树 / 树状数组) (等差数列 高阶差分 高阶前缀和)
题目链接: P1438 无聊的数列大致题意给定一个长度为nnn的序列, 有mmm次如下操作:1 l r k d 表示给区间[l,r][l, r][l,r]加上一个首项为kkk, 公差为ddd的等差数列.2 pos表示查询pospospos位置的数值是多少.解题思路写在前面: 如果你没有做过静态区间加等差数列, 推荐博客➡️点这里⬅️思路一: 线段树维护差分一般的区间修改操作, 我们很容易想到用线段树, 但是我们无法直接给某个区间加等差数列, 因为每个位置被修改的数值是不相同的. 我们考虑对原创 2021-10-17 14:35:56 · 1140 阅读 · 0 评论 -
Codeforces1567E Non-Decreasing Dilemma (线段树区间合并)
题目链接: Expression Evaluation Error大致题意给定长度为nnn的序列aaa, 有两种操作:1 pos c 修改apos=ca_{pos} = capos=c.2 l r 询问区间存在多少个连续非递减子序列.解题思路思维我们先只考虑查询操作: 对于一段长度为lenlenlen的连续非递减子序列而言, 其中会有∑i=1leni\displaystyle \sum_{i = 1}^{len}ii=1∑leni个符合要求的序列.因此我们只需统计[l,r][l, r][原创 2021-09-11 10:12:07 · 199 阅读 · 0 评论 -
P6327 区间加区间sin和 (线段树)
题目链接: P6327 区间加区间sin和大致题意给定长度为nnn的整数序列, a1,a2,...,ana_1, a_2, ..., a_na1,a2,...,an. 有m次操作:① l r c 给al,al+1,..,ara_l, a_{l + 1}, .., a_ral,al+1,..,ar都加ccc.② l r询问∑i=lrsin(ai)\displaystyle \sum_{i = l}^r sin(a_i)i=l∑rsin(ai).解题思路线段树很明显的一道区间修改原创 2021-09-09 19:42:58 · 235 阅读 · 0 评论 -
P6617 查找 Search (线段树)
题目链接: P6617 查找 Search大致题意给定长度为nnn的整数序列, a1,a2,...,ana_1, a_2, ..., a_na1,a2,...,an. 有m次操作:pos val 表示把aposa_{pos}apos改为valvalval.l r 询问[l,r][l, r][l,r]区间, 是否存在ai+aj=w,(i≠j)a_i + a_j = w, (i \ne j)ai+aj=w,(i=j).解题思路思维我们考虑如果没有修改操作, 每次询问一个区间是否有两原创 2021-09-09 19:38:53 · 189 阅读 · 0 评论 -
Codeforces1263E Editor (线段树 + 括号序列)
题目链接: Editor大致题意给出一系列操作, 问每次操作结束后, 括号能否正确匹配. 若可以, 则输出最大匹配深度, 否则输出-1.解题思路线段树 很经典的线段树区间合并处理括号匹配问题.关于线段树的括号匹配问题, 目前我知道的有两种: 一种是询问正确匹配括号个数, 另外一种是询问能否成功匹配, 以及匹配最大深度问题.对于一个区间而言, 括号能否成功匹配有两个判断标准:①左右括号数量要相同②任意前缀中, 右括号的数目不能大于左括号的数目.如果我们把左括号看为+1, 右括号看为-1,原创 2021-09-08 15:58:39 · 239 阅读 · 0 评论 -
Codeforces1295E Permutation Separation (线段树 + DP)
题目链接: Permutation Separation大致题意给定长度为nnn的序列aaa. aaa为1~n所有元素的一个排列.给定长度为nnn的序列bbb, 表示操作第iii个元素的花费为bib_ibi.你需要选定k∈[1,n−1]k \in [1, n - 1]k∈[1,n−1], 使得原序列分成两部分: left={a1,a2,...,ak},right={ak+1,ak+2,...,an}left = \{ a_1, a_2, ..., a_k \}, right = \{ a_{k +原创 2021-09-06 19:37:50 · 117 阅读 · 0 评论 -
Codeforces380C Sereja and Brackets (线段树区间合并)
题目链接: Sereja and Brackets2021年9月1日 翻新了题解大致题意给定一个括号序列, 编号从1~n.有m组询问, 每次询问[l,r][l, r][l,r]能够成功匹配的左右括号总数.解题思路本题解法是十分经典的线段树处理括号序列问题的做法.思维首先考虑对于单个位置, 要么是左括号, 要么是右括号, 一定无法匹配.接下来考虑选取两个位置, 只有左括号 + 右括号的情况可以匹配, 此时产生贡献.扩展: 当两个区间进行合并时, 左区间未匹配的左括号与右区间未匹配的右括号会原创 2021-09-01 13:01:19 · 419 阅读 · 1 评论 -
Codeforces1556E Equilibrium (线段树 + 最大连续子段和 + 括号匹配 / RMQ) (好题)
题目链接: Compressed Bracket Sequence大致题意给出长度为n的序列a,ba, ba,b.对于每个询问区间[l,r][l, r][l,r]: 你可以进行若干次操作, 每次操作必须选择偶数个下标p1,p2,p3,p4...p_1, p_2, p_3, p_4...p1,p2,p3,p4... 对于第奇数个下标, 在apia_{p_i}api处+1, 对于第偶数个下标, 在bpib_{p_i}bpi处+1.问: 能否在进行若干次操作后, 使得ai=bi,i∈[l,原创 2021-09-01 12:45:14 · 319 阅读 · 2 评论 -
Codeforces1557D Ezzat and Grid (线段树 + DP)
题目链接: Ezzat and Grid大致题意给出n个全0序列, 编号从1~n. 有m个操作: id l r, 表示把编号为ididid序列的[l,r][l, r][l,r]赋值为1.现在要求你删除尽可能少的的序列. 使得余下的k个序列按照编号从小到大排成k排, 其中相邻序列中为1的子段的交集不为空集.最终输出最少删除序列的数目, 以及被删除的序列编号.解题思路考虑题目要求我们删除尽可能少的序列, 我们可以转换为保留尽可能多的序列.思维 为了便于阐述, 进行如下定义: 如果两个序列为1原创 2021-08-12 01:07:11 · 158 阅读 · 2 评论 -
Codeforces1549D Integers Have Friends (思维 线段树)
题目链接: Integers Have Friends大致题意给出长度为n的序列a.如果存在整数m ≥ 2, a[l] % m == a[l + 1] % m == … == a[r] % m. 则称该连续子序列a[l, r]是友好的.问: 最长的连续友好子序列长度是多少.解题思路思维考虑到对于两个数x和y而言, 如果x % m == y % m, 则|x - y|一定是m的倍数.扩展: 那么对于若干个数字, 如果满足numi % m == C, 则任意两个数字之间的差值也一定是m的倍数.原创 2021-08-02 17:34:21 · 555 阅读 · 3 评论 -
Codeforces1555E Boring Segments (思维 线段树) (线段树好题!)
题目链接: Boring Segments超级推荐这个题, 感觉这个题超赞!大致题意给定n条线段, 每条线段覆盖区间为[l, r], 花费为c.现在可以从中任意选择若干条线段, 使得这些线段覆盖[1, m]区间.而我们选择这些线段的代价是: 被选择的线段中花费最大值 - 花费最小值.问: 最小的代价是多少. (题目保证一定存在解.)解题思路思维一般求极值的题目, 尺取法是很常见的一种做法.对于本题而言, 我们希望极值之差最小, 相当于我希望选择的这若干条线段花费近可能接近.由于我们可以原创 2021-08-02 01:34:02 · 320 阅读 · 0 评论 -
Codeforces914D Bash and a Tough Math Puzzle (思维 线段树)
题目链接: Bash and a Tough Math Puzzle大致题意给定一个长度为n的序列, 有两种操作:1 l r x 询问[l, r]区间, 最多修改1个位置的数字的条件下, 能否使得区间内所有数字的gcd = x.2 a c 把a位置的数字修改为c.解题思路思维我们先考虑查询操作. 设区间[l, r]gcd的结果为ddd, 如果d是x的倍数, 则我们一定可以至多修改一个位置, 使得d’ = x. 那这又代表着什么? 这代表着, [l, r]每一个位置上的数字都是x的倍数.原创 2021-07-30 13:53:49 · 219 阅读 · 0 评论 -
Codeforces1547F Array Stabilization (GCD version) (思维 线段树)
题目链接: Array Stabilization (GCD version)大致题意给定一个长度为n的数组, 下标从1~n. 其中an和a1相连(成环).每轮操作得到一个新的数组b: 对于所有的i∈[1, n], b[i] = gcd(a[i], a[i + 1]) (b[n] = gcd(a[n], a[1])). 最后把新数组b复制给原数组a.问: 执行完多少轮操作后, a数组中的所有数字都相同.解题思路考虑到最终a数组, 会有很多种相等的可能情况. 这不便于我们接下来的思考.两个数取g原创 2021-07-11 21:14:28 · 429 阅读 · 1 评论 -
2021牛客寒假算法基础集训营3 买礼物 (思维 + 线段树)
题目链接: 买礼物大致题意QAQ解题思路对于这种一看就是DS且带修改的题, 我们通常可以先忽略修改操作. 先只考虑查询操作.查询操作: 查询[l, r]是否有两个相同的数字, 我们可以维护一个last数组, 记录上一个与当前编号相同的位置. 这样我们对于每次查询, 我们可以遍历[l, r]的last数组, 看看是否存在一个last[i], 使得last[i]大于l.显然这样太暴力了, 我们其实想询问在[l, r]区间的last数组中的最大值是否大于l即可. 线段树很显然, 我们用线段树维护区间原创 2021-07-06 00:22:27 · 111 阅读 · 0 评论 -
Codeforces558E A Simple Task (线段树分裂 / 01线段树)
题目链接: A Simple Task大致题意给你一个长度为n个字符串, 有m次操作, 每次给定区间[l, r], 让你对这个区间升序 / 降序排列最终输出m次排序后的序列.解题思路线段树分裂 or 01线段树思路一: 线段树分裂, 复杂度: O((n + m)log26)我看这个题并没有线段树分裂的做法, 但对于本题而言, 确实是一种非常优秀的解法. 且可以进行推广, 即对于n个数字进行区间排序. 这是01线段树做不到的.核心思路: 对于每一个有序区间, 都开一棵权值线段树, 用set去维原创 2021-06-29 19:39:07 · 213 阅读 · 0 评论 -
Codeforces1539F Strange Array (思维 最大连续子段和)
题目链接: Strange Array大致题意给你一个长度为n的数组a, 对于每一个元素ai, 你需要选择一段区间[l, r], 且满足i ∈ [l, r].我们把这个区间排序后, i这个位置的元素离中心元素的距离称为 奇怪值, 而你要找到每一个元素的最大奇怪值.本题中对于中心元素的定义: 若为数组长度为奇数, 则为(l + r) / 2, 若为偶数, 则为(l + r + 1) / 2.本题对于排序时相等元素的处理方式: 可以按照任意顺序排列解题思路这个题的题意还是挺难理解的 and 写博客原创 2021-06-27 11:21:38 · 209 阅读 · 0 评论 -
P2824 [HEOI2016:TJOI2016]排序 (两种做法)
题目链接: P2824 排序大致题意给定一个1到n的排列,有m次操作, 每次选择一个区间[l, r]进行升序or降序排列.问: 操作完m次后, 第pos位置的数字是哪个?解题思路本文可能您也就看个乐, 这道题我的理解并没有很深.在这里会给出一种离线做法 二分 + 01线段树, 以及一种在线做法 线段树合并与分裂.离线做法只是针对本题这样, 最终操作完后, 询问一个位置的做法.而在线做法, 则比较通用了, 我们可以扩展题目, 假如边排序边询问, 或者要求输出最终排序后的序列.方法一:原创 2021-06-20 15:01:49 · 209 阅读 · 0 评论 -
P4556 [Vani有约会]雨天的尾巴 (线段树合并 + 树上差分)
题目链接: 雨天的尾巴注: 本文侧重于思路分析, 并不是针对线段树合并的讲解大致题意给出一个有n个节点的树, 有m次操作a b c表示给节点a, b所在的路径上增加1个c颜色.最后对于每个节点询问, 求当前节点最多的颜色是哪种.解题思路线段树合并 博主也是刚学线段树合并, 因此以下内容含有大量口胡, 如果您对此有疑惑, 麻烦评论区告诉我.我们一点点来分析这个题目的弱化版, 看看怎么我们就想到应该利用线段树合并弱化版①:首先我们不考虑他是一个树, 我们认为他就是一个区间, 路经修改我们就认为原创 2021-06-18 15:51:38 · 181 阅读 · 0 评论 -
CF202E XOR on Segment (线段树 拆位)
题目链接: XOR on Segment大致题意有一个长度为n的序列, 有两种操作. ①给定l r 你需要返回[l, r]的区间和 ②给定l r c 需要给[l, r]区间的每一个数字⊕c.解题思路线段树 这题一看就在考DS考虑到区间修改, 由于⊕操作不像区间加和等操作, 不可以直接传递. 因此我们考虑拆位来计算.线段树内部维护当前区间内所有数字每一个二进制位上1的个数. 这样如果我们要给一个区间异或上一个数字, 那么对于这个数字二进制位为1的位置而言, 区间内所有数字的这一位01会互换原创 2021-06-06 20:19:02 · 121 阅读 · 0 评论 -
CF1526C2 Potions (Hard Version) (贪心 + 线段树)
题目链接: Potions (Hard Version)大致题意有n个数, 编号从1~n, 第i个位置的值为a[i].从编号为1的数字开始选择, 一直到编号为n的数字. 对于第i个数字, 你可以选或者不选. 若选择的话, 总和会加上a[i].要求: 你需要选择尽可能多的数字, 并且保证选择每一个数字后, 总和不为负.解题思路贪心 + 线段树 (我看大家都是 带反悔的贪心做的, 代码太短了, 让我来个长的)贪心方向: 我们对于所有正数, 直接取即可. 对于负数的情况, 我们也肯定是优先取大的基原创 2021-05-29 20:52:34 · 382 阅读 · 2 评论 -
P3939 数颜色 (权值线段树)
题目链接: P3939 数颜色大致题意略解题思路相似题目推荐权值线段树对于这个题, 由于询问的是, 对于c颜色, [l, r]区间有多少该颜色的兔子. 相当于每次询问的就是一种颜色的区间查询.假设颜色只有一种, 那么我们直接写个线段树维护信息就可以了. 考虑到有多种颜色, 所以我们可以对于每种颜色建立一棵线段树, 树中维护当前颜色的区间信息.考虑到数据是比较离散的, 我们可以采用动态开点的方式维护信息.AC代码#include <bits/stdc++.h>#define原创 2021-05-19 16:16:53 · 281 阅读 · 0 评论 -
Disharmony Trees (线段树)
题目链接: Disharmony Trees大致题意略, 的确说不太好. 但是感觉vj那个中文题面叙述的还是很棒的.解题思路相似题目推荐线段树这个题和上面推荐的那个题算是同一类型. 只不过这个题要搞清楚rank()的含义. 其实就是非去重离散化.然后分析方式也和上个题目同理. 这里就不多赘述了.AC代码#include <bits/stdc++.h>#define rep(i, n) for (int i = 1; i <= (n); ++i)using namesp原创 2021-05-16 16:22:44 · 107 阅读 · 0 评论 -
Beans (权值线段树)
题目链接: Beans大致题意给定n, p, k. 表示给定一个长度为n的序列, 让你从中选出一段连续的子序列, 该段子序列之和记为sum.要求: sum / p 尽可能大, 且 sum % p <= k.最后输出满足要求的 sum / p 的最大值.解题思路首先我们很容易想到一个O(n2)的方式去暴力枚举出每一种子段情况. 分别判断是否合法即可. 但是很明显T到飞起.于是考虑到如何把 O(n2)降低.我们不妨从左到右去枚举所有的右端点r, 表示我们选择了[1, r]作为答案子序列.原创 2021-05-16 16:05:14 · 77 阅读 · 0 评论 -
HDU2852 KiKi‘s K-Number (线段树 树上二分 / 树外二分)
题目链接: KiKi’s K-Number大致题意有一个空的容器, 有三种操作:0 a 把a加入容器中1 a 把a从容器中删除. 若有多个, 只删除一个, 若不存在a, 则输出 “No Elment!”2 a k 求整个容器中, 第k个比a大的数.特别注意, 第三个操作是求第k个比a大的数字, 而不是第k大数解题思路权值线段树 树状数组的normal题目当然要用线段树来写啦!我们直接分析操作, 相当于是一个单点修改 和 一个需要分析的查询操作.那么我们如何去寻找第k个比a大的数字?方原创 2021-05-14 20:25:44 · 207 阅读 · 0 评论 -
POJ1990 MooFest (线段树)
题目链接: MooFest大致题意现在告诉你奶牛 i 的听力为 vi,这表示如果奶牛 j 想说点什么让她听到,必须用高于 vi×dis(i,j) 的音量。因此,如果奶牛 i 和 j 想相互交谈,她们的音量必须不小于 max(vi,vj)×dis(i,j)。其中 dis(i,j) 表示她们间的距离。现在 N 只奶牛都站在一条直线上了,每只奶牛还有一个坐标 xi。如果每对奶牛都在交谈,并且使用最小音量,那所有 N(N−1)/2 对奶牛间谈话的音量之和为多少?解题思路线段树 本身这个题是树状数组专题的原创 2021-05-14 09:00:39 · 137 阅读 · 0 评论 -
HDU5381 The sum of gcd (区间gcd 离线查询 + 线段树)
题目链接: The sum of gcd大致题意有一个长度为n的序列, 从1~n编号, 每个位置都有一个元素值.多次询问, 每次询问[l, r]区间, 所有子数组的gcd加和是多少.解题思路离线查询 + 线段树相似题目推荐这个题和推荐的题目类似, 分析方式都是一样的, 只不过这个题不是统计个数, 而是计算区间和.如果要看详细分析, 请点击上方 相似题目推荐 链接.首先, 我们通过相同的方式得到每个位置的gcd情况.现在考虑到区间累加贡献, 我们可以知道当前gcd的贡献区间是[L, R],原创 2021-05-11 15:49:32 · 183 阅读 · 0 评论 -
HDU5869 Different GCD Subarray Query (区间gcd 离线查询 + 线段树/树状数组)
题目链接: Different GCD Subarray Query大致题意有一个长度为n的序列, 从1~n编号, 每个位置都有一个元素值.多次询问, 每次询问[l, r]区间, 在该区间内所有子数组能产生多少种不同的gcd.解题思路离线查询 + 树状数组/线段树首先理解一下题意, 说白了就是每次询问有两层循环, i从l->r, j从i->r, 对于每一个子数组[i, j], 把所有元素求gcd, 放到一个set里. 最后问你set里有多少个元素. (所以读完发现了一个 n3还带lo原创 2021-05-11 15:13:17 · 207 阅读 · 0 评论 -
HDU3333 Turing Tree (离线查询 + 线段树/树状数组 or 主席树)
题目链接: Turing Tree大致题意有一个长度为n的序列, 从1~n编号, 每个位置都有一个元素值.询问: 多次查询, 每次查询[l, r]中去重后的元素总和.解题思路离线查询 + 线段树/ 树状数组 or 主席树相思题目推荐解法一: 主席树主席树的思路其实比较好想. 这个题的问题本质是, 询问每段区间, 求不重复的元素的总和. 那么我们按照每一个位置, 都去建立一棵线段树, 树中维护[1, index]位置不重复元素之和.当加到第index个位置时, 有两种情况: ①该数字在之原创 2021-05-11 13:23:03 · 279 阅读 · 0 评论 -
HH的项链 (三种解法) (离线查询 + 线段树/树状数组 or 主席树)
题目链接: HH的项链大致题意解题思路离线查询 + 线段树/ 树状数组 or 主席树解法一: 主席树主席树的思路其实比较好想. 这个题的问题本质是, 询问每段区间, 看看有多少个不重复的数字. 那么我们按照每一个位置, 都去建立一棵线段树, 树中维护[1, index]位置有多少个不重复元素.当加到第index个位置时, 有两种情况: ①该数字在之前没有出现过 ②该数字在之前出现在pos位置过(pos < index). (关于位置pos的维护, 我们可以采用哈希表)对于情况①, 我原创 2021-05-11 12:46:07 · 2234 阅读 · 5 评论 -
icpc2019 银川 Pot!!(线段树 + 结构体封装)
题目链接: Pot!!大致题意给定一个长度为n的序列, 初始所有元素都为1. 有如下两种操作: ① MULTIPLY l r x, 给[l, r]都乘上数x. ② MAX l r, 询问[l, r]区间所有数字中, 单个数字质因子出现的最大次数.解题思路线段树 做题之前我先看了看大佬们的博客, 都被吓傻了, 四棵线段树解题QAQ. 为什么不能用一棵树来维护四个值呢?首先分析一下这个题的突破点, 重点是x的取值范围, 只有2~10, 这是什么概念呢? 10之内的质数实际上只有2, 3, 5原创 2021-05-09 13:04:22 · 248 阅读 · 0 评论 -
Count Color(线段树区间染色)
题目链接: Count Color大致题意有n个位置, 从1~n标号, 有两种操作: ① C l r c 把区间[l, r]染色为c ②P l r 询问[l, r]区间有多少种颜色.解题思路线段树区间染色我拿到这题后, 这题不是傻逼题吗? 然后写了3h其实以前我是有博客写过关于线段树区间染色问题的, 博客链接我们只需要用一个懒标记表示当前区间是什么颜色即可, 每次更新的时候, 我们都下放懒标记, 查询的时候不需要下放懒标记.那么这个题我为什么做了这么久呢? (原因是网上的博客的写法都和原创 2021-05-04 20:11:26 · 987 阅读 · 0 评论