
线段树
文章平均质量分 55
线段树
Happig丶
我的孤独,虽败犹荣
展开
-
E - 买礼物(链表+线段树)
传送门题目大意给出一个序列,有以下两种操作:1 x1~~x1 x:将位置xxx上的数删除。2 l r2~~l~~r2 l r:若该区间内有两个相同的数输出111否则输出000。解题思路很好的一道题,之前在洛谷写过查询区间内是否有两数相同是用莫队维护的区间种类数,但是本题如果写莫队估计要TLETLETLE,然后学到了这手很强的问题转化技巧:对于区间内的每个数,原创 2021-02-08 00:17:03 · 143 阅读 · 0 评论 -
洛谷 P1890 gcd区间(DP/线段树)
题目链接首先做这道题要明白gcd的一个重要性质,即gcd区间具有可加性。假设我们对三个数求gcd,gcd(a,b,c)=gcd( gcd(a,b),c ) = gcd( gcd(b,c),a )本题应该有三种具体方法:线段树,ST表,DP。蒟蒻博主还不会ST表,于是就写了另外两种方法DP我们用一个二维数组ans[i][j] 表示区间 [i,j] 的gcd,由上述性质我们可以得出这样一个递推...原创 2020-02-03 21:06:02 · 421 阅读 · 1 评论 -
第十一届十月份蓝桥杯省赛 H - 子串分值和:求字符串所有子串的不同字符个数和(思维/线段树)
题目大意解法一:标答这种解法应该就是标答了吧,在这里学到的,简单精炼而又高效,orz对于一个长度为nnn的字符串,若我们考虑所有子串的个数,可以考虑以下做法:考虑第iii个字符,它和前面字符加起来的长度为xxx,它和后面字符加起来的长度为yyy,那么包含字符iii的所有子串就有x×yx \times yx×y个例如对于字符串abcdabcdabcd,其子串的个数和为1×4+2×3+3×2+4×11 \times 4+ 2 \times 3 + 3 \times 2+4 \times 11×4+2原创 2020-10-28 19:18:58 · 970 阅读 · 1 评论 -
线段树模板(洛谷P3372/P3373)
前言距离上次学习线段树已经过去了八个月左右,但是实际上忘了不少了,最近遇到不少线段树的题目。感觉有必要复习一下,很多时候写数组形式是最快最方便的,之前的模板都是结构体形式的,更新一下写法。区间加法+区间查询传送门//// Created by Happig on 2020/11/1//#include <bits/stdc++.h>#include <unordered_map>#include <unordered_set>using names原创 2020-11-03 11:02:30 · 229 阅读 · 0 评论 -
POJ - 2777 Count Color(线段树区间染色+区间查询种类数)
传送门题目大意给出一个序列,一开始都是数字111代表第一种颜色,最多有303030种颜色,现在有两种操作:1 x y col1~~x~~y~~col1 x y col:将区间[x,y][x,y][x,y]的气球都变成颜色colcolcol1 x y1~~x~~y1 x y:查询区原创 2020-11-02 15:06:11 · 526 阅读 · 0 评论 -
HDU - 1698 Just a Hook(线段树区间所有数修改为某值)
传送门题目大意给出一个初始全为111的序列,现在有多种操作每次都可以将区间[x,y][x,y][x,y]的数都修改为valvalval,最后求出序列所有数的和。解题思路和正常的线段树一样,只是将区间修改变成将树上保存的区间的和变为val∗(r−l+1)val*(r-l+1)val∗(r−l+1),因此只是在普通维护区间和的线段树基础上,将维护树的求和都变为直接赋值,懒惰标记也是直接赋值。//// Created by Happig on 2020/11/2//#include <b原创 2020-11-02 10:12:36 · 501 阅读 · 0 评论 -
B - 卡牌对战游戏(动态RMQ)
传送门1.因为一点小失误,一直没调出来,有点可惜2.实际上有点LIS的感觉,我们设d(i)d(i)d(i)表示从iii开始的攻击力最大值,b[i]b[i]b[i]为位置iii的攻击力,那么可以得出:d(i)=max(d(i),b[i]+d(j)),j>i{d(i) = max(d(i),b[i]+d(j)),j>i}d(i)=max(d(i),b[i]+d(j)),j>i考虑从后向前递推,那么我们只需要求出每一个位置前面已经更新的位置中,满足生命值之差的绝对值小于等于ddd的最大原创 2020-06-08 10:16:04 · 354 阅读 · 0 评论 -
动态区间最值(RMQ)——线段树
建树a数组为初始数组,tree数组为树typedef long long ll;const int inf=0x7fffffff;const int maxn=2e5+10;int a[maxn];int tree[maxn<<2];建树函数和普通线段树唯一的区别就是更新时取左右子树的最值void build(int i,int l,int r){ //i传入1 if(l==r){ tree[i]=a[l]; return;原创 2020-06-07 22:37:09 · 885 阅读 · 0 评论 -
树状数组(入门篇)
学习过线段树之后,应该会觉得线段树在各种维护问题上代码量比较大,而且比较麻烦。主要原因就是因为线段树把每个大区间都分成两个小区间,直到分成单独点。但是在实际操作的时候,很多申请的区间节点都是用不上的,造成了空间的浪费,那么如何解决这一问题呢?先引入前缀和的概念:前缀和:对于某一数组a[n],其中前缀和数组s[n]定义为s0=0,si=a[1]+…+a[i](1<=i<=n)。即a数...原创 2020-02-01 15:54:32 · 284 阅读 · 0 评论 -
洛谷P3373——区间加法和区间乘法结合的线段树
题目链接区间既有加法又有乘法,直接的乘法线段树显然就不行了,因为先加后乘和先乘后加绝对不一样。这时我们需要设置两个标记,分别是乘法标记和加法标记:typedef long long ll;const int N=1e5+10;ll a[N];struct tree{ ll l,r; ll sum; ll p_lazy,m_lazy; //前者为加法标记,后者为乘法...原创 2020-01-30 23:28:11 · 294 阅读 · 0 评论 -
线段树入门(加法、根号、乘法)
线段树简介线段树,一种特殊的二叉树——二叉搜索树。它将一段区间划分为若干单位区间,每一个节点都储存着一个区间。它功能强大,支持区间求和,区间最大值,区间修改,单点修改等操作线段树的每一个节点都储存着一段区间[L,R]的信息,其中叶子节点L=R。它的大致思想是:将一段大区间平均地划分成2个小区间,每一个小区间都再平均分成2个更小区间……以此类推,直到每一个区间的L等于R(这样这个区间仅包含一个节...原创 2020-01-30 22:37:41 · 1393 阅读 · 0 评论