随笔分类 - 数据结构——线段树
摘要:题目链接:https://www.acwing.com/problem/content/298/ 题目给定一个长区间[m,e]和一些短区间,短区间上有花费,问覆盖长区间的最小话费是多少? 通过dp可以在最少区间数模型上进行修改,转移的时候算上的是花费值,最后用线段树维护一下区间最小值即可。时间复杂度
阅读全文
摘要:题目链接:http://poj.org/problem?id=2482 给出每个点框定的区域,求区域叠加的最大值,可以通过如下算法: 将每个可行点都标记,记录这些点上的权值,维护一个叶结点是一个权值点的线段树,更新的时候注意,由于所有的点都是可行点,所以右边界要在最后删除,遇到同样的x坐标的,优先叠
阅读全文
摘要:题目链接:http://poj.org/problem?id=1151 实际上不下放lazytag就是一个保持另一层记录的过程。简单的来说,就是当cnt为0的时候,t[rt<<1].len+t[rt<<1|1].len才是真实信息,当cnt不为0的时候,这段的段长才是真实信息,t[rt<<1].le
阅读全文
摘要:题目链接:https://www.acwing.com/problem/content/247/ 操作有两种:求区间最大公约数+区间修改。 两者的结合可以运用更相损减术,维护一个差分数列,用一个树状数组维护数列的差分前缀和,其中要注意的是,树状数组和线段树的维护中要防止索引的越界!!其次,gcd得到
阅读全文
摘要:题目链接:https://www.acwing.com/problem/content/246/ 线段树合并线段的时候要更新结点中的ans值,但是这个值的更新依赖于lmax与rmax,这两个值的更新又依赖于sum,故查询的时候需要返回的是一个结点,返回代表的区间的信息。 代码: #include<i
阅读全文
摘要:题目链接:http://poj.org/problem?id=2182 题目给出一个n,代表牛的数量,编号是1-n,另外给出n-1个数,代表在某个位置之前有多少数是比这个位置的数小的,1之前没有比它小的,所以不给出。想法是最后一个数可以最先确定,如果最后一个数前面有a个数比他小,那他就是第a+1个数
阅读全文
摘要:题目链接:http://icpc.njust.edu.cn/Problem/Hdu/4107/ 题目给定一个初始值都是零的序列,操作只有一种,就是给一个区间加上一个数,但是当一个数大于等于给定的P的时候就会在这个数上加上两倍的C,否则加上一倍的C。对于这种区间修改以及最终查询的问题我们首要想到的就是
阅读全文
摘要:题目链接:https://www.luogu.com.cn/problem/P3372 题目是经典的线段树模板题,要求支持三种操作:①、查询区间和取模的值 ②、给指定区间加上一个值 ③、给指定区间乘上一个值 只要明确先做乘标记在做加标记就解决了问题,因为先做加标记再做乘标记的话就会出现加标记是小数的
阅读全文
摘要:题目链接:http://icpc.njust.edu.cn/Problem/Hdu/3973/ 题意是:给出一个模式串,再给出一些串组成一个集合,操作分为两种,一种是替换模式串中的一个字符,还有一种是查询模式串中[l,r]区间的字符串有没有出现在字符串集合中。 由于数据量很大,只能用O(nlogn)
阅读全文
摘要:题目链接:http://icpc.njust.edu.cn/Problem/Hdu/2795/ 题目大意:有一块长方形木板,从上到下被分成h*w的区域,现要将n个长条放进这些区域中,要求从上到下只要后面空余位置够就放,紧贴最左侧放置。由于给出长度为C的长条之后只要一个区间[l,r]的最大值大于等于C
阅读全文
摘要:1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef unsigned int ui; 4 typedef long long ll; 5 typedef unsigned long long ull; 6 #define pf pri
阅读全文
摘要:题目链接:https://www.luogu.com.cn/problem/P1198 线段树的单点更新+区间查询,典型的求区间最大值。 代码如下: 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef unsigned int ui;
阅读全文