线段树
文章平均质量分 65
Black__wing
acm菜鸡
展开
-
线段树基本操作
线段树主要思想用二分区间的形式,以空间换时间降低时间复杂度,建树时间复杂度为nlog(n),查询时间复杂度为log(n):通常建树时用数组模拟链表建树,即获得上图样式线段树,从最大的区间二分,到两个小区间,然后小区间再二分直到得到l==r,即代表一点的区间(例如:1-1)这样的区间,对于数组模拟线段树,我们可以得到他们在我们树数组中的位置,即图中每个框上面圆圈中的数字。这样可以帮助我们快速...原创 2018-08-06 11:13:37 · 475 阅读 · 0 评论 -
牛客网小白月赛 16 H 线段树求gcd
线段树维护差分数组,求gcd#include<bits/stdc++.h>using namespace std;const int maxn=1e5+100;int sum[maxn*4];int gcd[maxn*4],maxx[maxn*4];int a[maxn];void pushup(int i){ sum[i]=sum[i*2]+sum[i*2...原创 2019-08-08 10:24:35 · 195 阅读 · 0 评论 -
hdu 5068&&2019牛客网暑假多校训练赛E 线段树+矩阵乘法
hdu 2068#include<bits/stdc++.h>using namespace std;//用线段树维护一个2*2的矩阵,a[i][j]表示从这一层第i个门到下一层第j个门是否联通,//第i层到第j层之间的矩阵相乘之后的结果矩阵,各元素和为从第i层到第j层的种类数const int mod=1000000007;struct mat{ long ...原创 2019-07-24 19:43:38 · 217 阅读 · 1 评论 -
线段树区间01区间值异或与相邻1个数
#include<bits/stdc++.h>using namespace std;int tr[800000],l1[800000],r1[800000];int l2[900000],r2[900000],tr2[800000];int lazy[900000],a[200000];void pushup(int i,int l,int r){ int m...原创 2019-07-14 21:30:52 · 425 阅读 · 0 评论 -
hdu 4578 Transformation
从题面可以推断,如果一个区间中的值很可能为等于同一个值,即有操作涉及,对某个区间设为t之类,就很可能存在一个区间,区间值全部相等,就可以用线段树做标记,标记区间值,如果,区间中有值不相等则对其赋值为-1,注意如果区间值相等修改,或者查询时需要下推标记。#include<bits/stdc++.h>using namespace std;int mod=10007;int ...原创 2019-06-07 14:56:57 · 151 阅读 · 0 评论 -
线段树 最大连续区间 hdu1540
#include<bits/stdc++.h>using namespace std;int li[100000*4],ri[100000*4],mi[100000*4];void pushup(int i,int l,int r){ int mid=l+r>>1; if(li[i*2]==(mid-l+1)) { li[i...原创 2019-06-05 20:28:05 · 152 阅读 · 0 评论 -
线段树区间染色 map,vector离散化 poj2528
#include<map>#include<vector>#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;//线段树区间染色,对于杂色区间tree赋-1.没有颜色赋值为0,其他颜色...原创 2019-05-31 12:58:27 · 217 阅读 · 0 评论 -
区间众数问题,线段树
区间众数,利用线段树,维护区间众数转换的平度序列。线段树记录区间最大值,即为连续区间众数连续个数。平度序列例如:1 1 1 1 2 3 3 3 1 2 3 4 1 1 2 3代码:#include <iostream>#include <algorithm>#include <cmath>#include <cstring&...原创 2019-01-08 20:27:45 · 2330 阅读 · 0 评论 -
nefu 1330 树上求和dfs序+线段树
dfs序即先序遍历树,对于第一个节点进行总结点个数加一并且赋值操作。思路:对于给出的点,进行vecter建树。建树完成后dfs序求出各节点,dfs序,ls[i]表示当前节点的dfs序为多少,rs[i]表示以当前节点为根的子树的最右边节点值。代码:#include <iostream>#include <stdio.h>#include <strin...原创 2019-01-08 18:55:53 · 353 阅读 · 0 评论 -
codeforces 558E
计数排序:计数排序就是对于一个已知序列找出序列最大值,最小值后。开辟一个大小为max-min+1的辅助数组,在辅助数组上对已知序列进行计数。即fuzhu[a[i]-min]++。然后再在愿数列上按照一定顺序(降序/升序)进行赋值。for(int i=0,j=0;i<max-min+1;i++)//升序{ if(fuzhu[i]!=0) { a[j+...原创 2019-01-11 10:59:15 · 241 阅读 · 0 评论 -
无名二(线段树维护区间最小值+暴力修改)
对于这个题,一开始想要解决的就是怎么将向下取整优化掉,否则线段树修改没有意义。其实不然,线段树维护b区间,对于每次a区间+1操作,改变为-1操作,对于这个区间只需求出贡献点,贡献多少即可。用一个sum维护。对于线段树每次暴力修改到每个点,时间复杂度1e8左右。#include <bits/stdc++.h>using namespace std;const int M ...原创 2018-11-12 20:10:45 · 447 阅读 · 1 评论 -
nefu_1506 rmq 区间众数
此题是有序的区间众数问题可将数列变为频度序列,然后rmq求区间最大值,同时处理左边可能有只有一段在这个区间的情况,预处理数列,求出每个上升序列的起点值,然后减出,左边这段在区间内的长度。代码:#include <iostream>#include <cstdio>#include <cmath>const int MAXN = 1e6 ...原创 2018-09-12 20:46:54 · 321 阅读 · 0 评论 -
线段树 扫描线
例题HDU-1542-Atlantis:扫描线的题就是求在一个二维平面上,多个矩形的覆盖面积,那么这个面积如何用线段树来维护呢?下面解析请配合代码食用。我们可以知道,线段树对于区间修改,求和上时间复杂度很低,因此,我们就用线段树来维护,x轴上我们需要的区间长度。如图我们想要求的三个矩形的坐标我们将它们画出来是这样的:那么我们线段树维护的就是1-2,2-3,3-4,4...原创 2018-08-15 16:52:36 · 1157 阅读 · 0 评论 -
线段树区间合并
线段树区间合并主要解决一段连续区间修改,查询问题。线段树是树形结构,为解决相邻区间更新,修改问题,我们必须在原本须要维护的区间内,连续段最大值的基础上加上,从左,右两边起,最大的连续区间长度。例题:酒店:此题开始时,所有的房间都是空房间,有两个操作:1、查询长度为x的连续房间,并将房间全部填满,输出左端点值。2、表示退房,将x,到x+y-1的房间退房。我们来看线段树,我们...原创 2018-08-14 16:27:32 · 1809 阅读 · 0 评论 -
线段树与lazy标记
线段树区间修改与区间查询,如果我们对区间中的每一个值依次进行修改,那么最终结果一定是tle。因此我们在这里加入lazy标记。lazy标记,对于区间更新而言,如果我首次更新这段区域,我就先将需要更新的值加到lazy标签中,暂时不向子节点更新。在第二次更新过程中,我们查到此点,则顺手将此点的lazy标签中的值,更新到子节点,然后再重置lazy标签。这样一来,就将区间更新的时间复杂度,进一步降低。...原创 2018-08-06 11:41:03 · 500 阅读 · 0 评论