线段树
线段树
JA_yichao
这个作者很懒,什么都没留下…
展开
-
SSL集训 2021.08.18 提高B组 T4 graph【线段树分治】
SSL集训原创 2021-08-18 20:57:25 · 111 阅读 · 0 评论 -
Luogu P5787 二分图 /【模板】线段树分治 【模板题】
题目 思路 考虑这样一个问题: 有一些操作,每个操作只在 l∼rl\sim rl∼r 的时间段内有效。 有一些询问,每个询问某一个时间点所有操作的贡献。 对于这样的询问,我们可以离线后在时间轴上建一棵线段树,这样对于每个操作,相当于在线段树上进行区间操作。 遍历整颗线段树,到达每个节点时执行相应的操作,然后继续向下递归,到达叶子节点时统计贡献,回溯时撤销操作即可。 这样的思想被称为线段树分治,可以在低时间复杂度内解决一类在线算法并不优秀的问题。 对于此题 首先,图是二分图的充要条件是不存在奇环,这个原创 2021-08-18 11:07:34 · 180 阅读 · 0 评论 -
YbtOJ 线段树问题课堂过关 例5 字符串排序【线段树】
字符串排序原创 2021-06-12 21:33:40 · 378 阅读 · 0 评论 -
YbtOJ 线段树问题课堂过关 例4 维护序列【线段树】
思路 这道题是模板题,花了我两个小时调试 注意: lazy_tag_mul 赋初值要赋给所有节点,不能只赋给叶子节点。 模数不要乱模,该模的地方就模。 代码 #include<iostream> #include<cstdio> using namespace std; long long P; long long n,m,k,a,b,w; struct node { long long sum,tag1,tag2; }tree[4000010]; void build(l..原创 2021-06-12 10:52:40 · 122 阅读 · 0 评论 -
YbtOJ 线段树问题课堂过关 例3 小白逛公园【线段树】
思路 (明天补)。。。 代码 #include<iostream> #include<cstring> #include<cstdio> using namespace std; int n,m,k,aa,bb; struct node { int sum,maxx,lmax,rmax; }tree[4000010]; node add(node a,node b) { node c; c.sum=a.sum+b.sum; c.lmax=max(a.lmax,..原创 2021-06-11 21:01:10 · 140 阅读 · 0 评论 -
YbtOJ 线段树问题课堂过关 例2 区间查改【线段树】
思路 这道题是线段树模板题 但是不同于上一题,这道题是区间修改,所以我们引入lazy tag。 因为如果直接对线段树的每个儿子进行修改,时间会超限,所以我们把父亲的值直接传给左右儿子,然后用lazy tag来标记,当需要用到当前子树时就继续传递lazy tag就好了。 代码 #include<iostream> #include<cstdio> #include<cmath> using namespace std; long long w,l,r,xx,n,q; s..原创 2021-06-03 16:44:49 · 168 阅读 · 0 评论 -
YbtOJ 线段树问题课堂过关 例1 求区间和【线段树】
思路 这道题是线段树模板题,注意: 数组要开四倍空间。 不要把原数列和线段树的下表弄混。 代码 #include<iostream> #include<cstdio> #include<cmath> using namespace std; long long n,m,kk,a,b; struct node { long long sum; }tree[4000010]; void add(long long k,long long l,long long r,..原创 2021-06-02 17:38:52 · 122 阅读 · 0 评论 -
luoguP1198 最大数【线段树】
这道题基本上可以说是线段树模板题了。 但是我们要注意,在插入时,我们需要更新相应的父节点。 用线段树来存数,不用数列。 代码: #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> using namespace std; int tree[8000020]; int n,d,t,x,js; char c[2]; vo.原创 2020-08-10 17:04:58 · 131 阅读 · 0 评论 -
SSL2648 线段树练习题5【线段树】
这道题其实也是一道线段树模板题 但是这道题是动态查询和修改。 #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> using namespace std; int n,m,x,js,l,r; char c; struct node { int l,r,cover; }tree[4000010]; void build(原创 2020-08-09 21:48:03 · 151 阅读 · 0 评论 -
SSL2647 线段树练习题4【线段树】
分析: 对于以后越来越复杂的线段树题, 先行构造一棵线段树,将左右区间放进去是个很好的选择。 这样后面的插入和统计将会变得比较简单简便。 void build(int x) { if(seg[x].r-seg[x].l>1) //当前节点不是叶子结点 { int mid=(seg[x].l+seg[x].r)/2; //取中 seg[x*2].l=seg[x].l,seg[x*2].r=mid; //往左子树走 seg[x*2+1].l=mid,seg[x*2+1].r=se.原创 2020-07-22 16:31:31 · 156 阅读 · 0 评论 -
SSL2646 线段树练习题3【线段树】
思路: 与上一题一样, 仍然定义tree如下: tree=-1表示该区间由多种颜色组成。 tree>=0表示该区间只有一种单一的颜色cover。 插入操作与线段树333一样 值得注意的是统计操作 long long ccount(long long x,long long l,long long r,long long &lc,long long &rc) { long long lt=0,rt=0; if(tree[x]!=-1) //如果当前节点只有一种颜色 { .原创 2020-07-22 11:35:59 · 149 阅读 · 0 评论 -
SSL2645 线段树练习题2【线段树】
这道题是一个线段树题。 和线段树一差不多, 就直接上代码: #include<algorithm> #include<iostream> #include<cstdio> #include<cmath> using namespace std; int s,n,ans,l[400010],r[400010]; int tree[400010],f[400010]; void insert(int x,int l,int r,int a,int b,int c.原创 2020-07-22 11:11:26 · 128 阅读 · 0 评论 -
SSL2644 线段树练习题一【线段树】
线段树 在一类问题中,我们需要经常处理可以映射在一个坐标轴上的一些固定线段,由于线段是可以互相覆盖的,有时需要动态地取线段的并,例如取得并区间的总长度,或者并区间的个数等等。一个线段是对应于一个区间的,因此线段树也可以叫做区间树。 构造思想 线段树是一棵二叉树,树中的每一个结点表示了一个区间[a,b][a,b][a,b]。每一个叶子节点表示了一个单位区间。对于每一个非叶结点所表示的结点[a,b][a,b][a,b],其左儿子表示的区间为[a,(a+b)/2][a,(a+b)/2][a,(a+b)/2],右.原创 2020-07-22 09:45:00 · 149 阅读 · 0 评论