线段树
文章平均质量分 63
最菜的acmer
这个作者很懒,什么都没留下…
展开
-
POJ3468(线段树+lazy思想)
lazy 思想就是我这一段在更新的区间内这段更新一下记录一下增加的值到时候子线段要用的时候再用,这样可以节省时间,否则直接更新下去太暴力了会超时#include#includeusing namespace std;#define ls 2*i#define rs 2*i+1#define mid (l+r)/2#define tmid (T[i].l+T[i].r)/2cons原创 2017-04-29 12:51:51 · 300 阅读 · 0 评论 -
hdu5405(dfs序+树链剖分+线段树)
题解:因为我要查询有多少,i到j的路径上有与u到v路径上的公共点,那么我们可以先求没有经过u到v路径的上点的平方的总和然后再用所有点权值的总和的平方减去他,那么就是答案。然后我们怎么操作能?因为用树链剖分的话不会经过的点的对应的轻儿子的结点,所以我们记录一些对应轻儿子的权值平方的总和,然后我们如果某链往另外一条链上跳的话说明我这个点是那个点的轻链,我们再补回去就好了,然后还有一种情况是我重儿子没有...原创 2018-07-18 10:49:35 · 314 阅读 · 0 评论 -
ZOJ - 4009(线段树)
题解:打表一下到99971你会发现循环节的最小公倍数为48,因为是区间修改那么用线段树,接着我们在更新的时候只需要把该区间的标记一下被更新加一,合并区间的时候要加 上子区间被更新的次数,最后我们查询的时候要增加一个d表示上面的区间被更新几次,最后的答案就是T[(x+lazy[rt])%48][rt]即可#include<iostream>#include<cstring>...原创 2018-03-15 21:29:24 · 265 阅读 · 0 评论 -
HYSBZ1036(树链剖分)
题解:树链剖分模板题#include#include#include#includeusing namespace std;#define root 1,1,n#define ls 2*rt#define rs 2*rt+1#define mid (L+R)/2#define lson ls,L,mid#define rson rs,mid+1,R#define原创 2017-12-07 20:34:34 · 181 阅读 · 0 评论 -
fzu2082(树链剖分)
题解:树链剖分模板题,边的数值改成与边两个深度比较大的端点的数值即可,最后减去公共祖先#include#include#include#includeusing namespace std;#define ls 2*rt#define rs 2*rt+1#define mid (L+R)/2#define lson ls,L,mid#define rson rs,mid+1,原创 2017-12-07 18:53:42 · 186 阅读 · 0 评论 -
UVA - 688(线段树+扫描线)
题意:给你n个矩形的中心和中心到边的距离让你求面积并题解:套一下模板就好了#include#include#include#include#includeusing namespace std;const int maxn = 2e3+5; struct node{ double x1,x2,y; int f;}E[2*maxn];double x[2*m原创 2017-12-24 23:51:16 · 461 阅读 · 1 评论 -
POJ-3237(树链剖分+线段树)
题解:更改把路径上的边值都变为负值一看就是树链剖分,接着我们用点连着深度比较深的边的值设为边的值那么我们查询的时候当到达最近公共祖先的时候最近公共祖先的点的编号注意加一,接着就是线段树的更新用1和0表示区间变为负数或者不变为负数即可,最后要记录一下边队应的编号即可#include#include#include#includeusing namespace std;#define l原创 2017-12-23 15:47:10 · 373 阅读 · 0 评论 -
HYSBZ - 2243(树链剖分)
题解:在树上路径的查询一看就是树链剖分,然后查询是如何查询呢,如果我这条链的头结点颜色和其父节点颜色一样那么我们答案就要减一,更新线段树的用一个l,r记录最右端和最左端的颜色,如果左区间的右端点颜色和右区间的左端点颜色一样那么就要合并减去一段即可#include#include#include#includeusing namespace std;#define root 1,1,n原创 2017-12-08 15:23:34 · 208 阅读 · 0 评论 -
POJ - 2373(线段树+DP)
题目: 约翰的奶牛们发现山督上的草特别美味.为了维持草的生长,约翰打算安装若干喷灌器.为简化问题,山脊可以看成一维的数轴,长为L(1≤L≤10^6),而且L-定是一个偶数.每个喷灌器可以双向喷灌,并有确定的射程,该射程不短于A,不长于B,A,B(1≤A≤B≤103)都是给出的正整数.它所在位置的两边射程内,都属它的灌溉区域.现要求山脊的每一个区域都被灌溉到,而且喷灌器的灌溉区域不允许重叠, 约翰有原创 2017-10-16 23:09:23 · 421 阅读 · 0 评论 -
HDU4553(线段树区间合并)
题解:设两个区间表示屌丝剩下的区间,女神剩下的区间,然后用lazy思想更新一下,lazy = 0被更新成空闲的,lazy = 1表示这段区间被更新成屌丝的,lazy = 2表示这段区间被更新成女神的,lazy = -1表示这段区间不做任何操作。注意一下更新屌丝的时候如果下面的是左右子区间lazy = 0时要先把左右子区间更新一下即可,这样才能确保左右子区间女神没有用#include#in原创 2017-09-13 21:13:06 · 494 阅读 · 0 评论 -
hdu6155-Subsequence Count(线段树+矩阵+dp)
题解:dp[i][0],表示到第i个字符以0结尾的不同子串个数,dp[i][0]到第i个字符以1结尾的不同子串个数如果第i个字符是0的话dp[i][0] = dp[i-1][1]+dp[i-1][0]+1,dp[i][1] = dp[i-1][1]否则 dp[i][0] = dp[i-1][0],dp[i][1] = dp[i-1][1]+dp[i-1][0]+1然后可以推原创 2017-08-21 20:29:24 · 372 阅读 · 0 评论 -
codeforces838B-Diverging Directions
题解:先dfs序给这些树结点重新编号,然后就可以搞成线段树 L[x]表示这个结点的开头R[x]这个结点的结尾然后中间这些编号就是这个结点所以的叶子结点的编号,然后用线段树维护从根结点到达这些区间内的结点再直接回到根结点的最短距离。 更新的话,如果是更新直接到的结点那么只要把他的两个端点更新一下即可否则就是这条边的子结点所包括的区间更新 查询的话根据y是不是x 的子节点然后查询方式即可 如果y原创 2017-08-08 22:02:23 · 510 阅读 · 0 评论 -
大学生程序设计邀请赛(华东师范大学)-D题(线段树+随机化)
题解思路,更新每一个点最多可以传染到哪个地方然后更新线段树,更新结点的时候不能根据x坐标从左往右更新要随机更新因为 如果数据是: 1 3 3 1…..后面省略 这样更新我更新完第一个位置还要再更新一下第二个位置但是如果先更新第二个位置的话更新第一位置的话就可以少更新2之前的位置因为数据位置我们要打乱随机更新 题目链接#include<iostream>#include<algorithm>原创 2017-05-18 17:55:26 · 358 阅读 · 0 评论 -
hdu-11992-更新区间
题解思路:因为矩阵最多20行可以用线段树更新,注意点矩阵初始的所有元素为0然后矩阵重置为v的时候记得下面的更新加的元素已经不再需要了重置为0题目链接#include#include#include#include#define inf 0x3f3f3f3f#define mid (L+R)/2#define check L >= l && R #define ls原创 2017-05-13 01:15:28 · 202 阅读 · 0 评论 -
UVA-11235-线段树加区间合并
记录每个位置的左边界和又边界,然后建起线段树如果左区间的尾部和右区间的头部是一样的数值,可能这个尾部这个数在里面出现次数会变成最大所以要更新一下这个这段的最大出现次数题目链接#include#include#include#include#define inf 0x3f3f3f3f#define mid (L+R)/2#define lson 2*i,L,mid#de原创 2017-05-12 22:30:07 · 297 阅读 · 0 评论 -
HDU-4027线段树加减枝
题目链接如果这个区间都是的数值都是1就不用再更新了,更新了也是浪费时间#include#include#include#include#include#includeusing namespace std;typedef long long int ll;#define ls 2*i#define rs 2*i+1#define mid (T[i原创 2017-05-11 21:33:04 · 361 阅读 · 0 评论 -
hdu4348(主席树区间更新)
题解:因为该题涉及到线段树要还原回去,那么肯定用主席树的区间修改区间查询,我们更新的时候直接将该点的总和加上一个(r-l)*v;然后查询的时候上面的lazy传递下来,然后再补上(R-L+1)*x,x = 传递下来的lazy总和#include<iostream>#include<cstring>#include<algorithm>#includ...原创 2018-07-18 10:53:18 · 825 阅读 · 0 评论