usingnamespacestd; LL tree[4*N+1];// 线段树 LL lz[4*N+1];// 延迟标记 LL n,t; set< LL > ans; (将所有颜色用set装起来,利用set自动去重的性质,最后set的数有几个,就是有多少海报) // 创建线段树 voidbuild(LL node,LL l,LL r){ if(l == r){ tree[node]=0; return; } LL mid ...
1、 线段树是二叉树,且必定是平衡二叉树,但不一定是完全二叉树。 2、 对于区间[a,b],令mid=(a+b)/2,则其左子树为[a,mid],右子树为[mid+1,b],当a==b时,该区间为线段树的叶子,无需继续往下划分。 3、 线段树虽然不是完全二叉树,但是可以用完全二叉树的方式去构造并存储它,只是最后一层可能存在某些...
用平行与y轴的直线自左向右平移,分别与矩阵左边界右边界相遇 y轴上设置线段树记录区间覆盖长度 遇到一边界时,计算面积,用下一边界减去当前边界,获矩形宽,取线段树区间覆盖长度获矩形长,遂得面积 若为左边界,表对应区间覆盖数增,否则减 以此往复 代码(以LuoguP5490为例) #include <iostream> #include <cstdlib> ...
首先遍历右端点范围r,用线段树维护每一位到r的区间中有多少种颜色,记为c 则处理到第a[i]个段时,将(last[a[i]],i]区间+1 如r=6时 a={3,1,5,2,4,1} 处理第6位之前c={5,4,3,2,1,0} last[a[6]]=2,然后将区间(2,6]+1 c={5,5,4,3,2,1} 此时,在询问中找右端点为r的询问[l,...
(2)建立线段树,原始n个数据进行映射后对线段树插入更新。注意上限的问题,因为已经离散化了。每个节点上有个值val,表示处于此段区间的是编号为val的海报。 (3)DFS搜索线段树,遇到tag=1的节点就进行标记,然后返回,其子树都没用处的,已经被覆盖。可能会有重复的,比如一段为[2,3],一段为[3,5],因为不能放在一...
1. 离散化 + 权值线段树/权值树状数组2. CDQ 分治 算法1: 离散化+权值线段树 维护区间信息的线段树,例如区间和,区间最大/最小值,也叫区间线段树。 权值线段树维护元素值的计数,节点的位置代表元素值,节点的值代表元素的数量,其中叶子节点代表特定元素的数量,非叶子节点代表一个取值范围的元素的数量。 每来一个新...
//线段树+离散化+扫描线 //2010年7月21日19:35:45 //Coded By abilitytao #include<iostream> #include<cmath> #include<algorithm> usingnamespacestd; #defineMAXN 10010 structSTnode//线段树的节点 { intl,r; intlen;//区间内代表的长度
离散化是算法竞赛中一种常用技巧,常应用于数据结构题中。举例来说,若在面对线段树裸题,数据范围为1-1e10,若直接开4倍线段树,范围将无法满足,导致拿分受限。离散化技术则能将无限空间中的有限个体映射到有限空间,提升算法效率。离散化原理在于保持数据相对大小不变的情况下,对数据进行缩小处理。原...
类似于区间修改与求和问题,由此联想到线段树,因此可以使用线段树来维护扫描线上被矩形覆盖的情况。但是横坐标为浮点数,因此首先要将所有的横坐标进行排序离散化处理,即将所有的矩形的边横坐标从小到大排序,将排序序号作为线段树的区间号。同时,我们还要保存原来真实的浮点值,以便计算长度。