首页 > 其他分享 >李超线段树

李超线段树

时间:2024-07-15 21:51:41浏览次数:16  
标签:rt return int 线段 李超 cr dou

李超线段树

用来维护线段(一次函数)信息。

值域线段树:

对于值域线段树维护\(x\)轴 上的区间\([l,r]\),维护\(s\),表示在\(x=mid\)处可能取最大值的线段(不一定就是最大)。

添加操作:

新边\(u\),旧边\(v\)。

1.将边拆为最多\(\log\)个在线段树上的线段。

2.如果\(u\)与\(v\)存在完全覆盖关系,就直接去最优边。

3.如果有交点,则递归到有交点的那一侧。(\(\log\)层)

对于递归,就是在该区间去最优边,再将另一条边传到子节点。

查询操作:

记录从根到叶子节点这一条链上的最优边。

struct line{dou k, b;}L[N];
dou clac(int u, dou x){return L[u].k * x + L[u].b;}
void add(dou x, dou y, dou X, dou Y){
	if(x == X) L[++cnt] = {0, max(y, Y)};
	else L[++cnt].k = (Y - y) / (X - x), L[cnt].b = Y - L[cnt].k * X;
}
int cmp(dou x, dou y){
	if(x - y > eps) return 1;
	if(y - x > eps) return -1;
	return 0;
}

struct L_S_T{
#define ld rt * 2
#define rd rt * 2 + 1
#define mid (cl + cr >> 1)
	int s[M << 2];
	void cg(int rt, int cl, int cr, int u){
		int &v = s[rt];
		int bmid = cmp(clac(u, mid), clac(v, mid));
		if(bmid == 1 || (!bmid && u < v)) swap(u, v);
		int bl = cmp(clac(u, cl), clac(v, cl)), br = cmp(clac(u, cr), clac(v, cr));
		if(bl == 1 || (!bl && u < v)) cg(ld, cl, mid, u);
		if(br == 1 || (!br && u < v)) cg(rd, mid + 1, cr, u);
	}
	void modify(int rt, int cl, int cr, int l, int r, int u){
		if(l <= cl && r >= cr){
			cg(rt, cl, cr, u);
			return ;
		}
		if(l <= mid) modify(ld,  cl, mid, l, r, u);
		if(r > mid) modify(rd, mid + 1, cr, l, r, u);
	}
	int check(int u, int v, int x){
		if(cmp(clac(u, x), clac(v, x)) == 1) return u;
		if(cmp(clac(u, x), clac(v, x)) == 0) return min(u, v);
		return v;
	}
	int query(int rt, int cl, int cr, int k){
		int res = s[rt];
		if(cl == cr) return res;
		if(k <= mid) res = check(res, query(ld, cl, mid, k), k);
		else res = check(res, query(rd, mid + 1, cr, k), k);
		return res;
	}
}S;

标签:rt,return,int,线段,李超,cr,dou
From: https://www.cnblogs.com/Peng1984729/p/18304064

相关文章

  • 吉司机线段树
    吉司机线段树为了方便说板子,这里直接把板子题放上去讲了。线段树3简单说一下\(5\)个操作都在干什么:区间加一个数。区间和一个数取最小值。区间求和。区间求最大值。区间求历史最大值。好了,前\(4\)个操作如果单独拉出来出成一道题,显然是好做的,于是我们的......
  • 线段树——AcWing 245. 你能回答这些问题吗
    目录线段树定义运用情况注意事项解题思路AcWing245.你能回答这些问题吗题目描述运行代码代码思路改进思路线段树定义线段树是一种用于区间查询和更新问题的数据结构。它通过递归地将一个区间分解为若干子区间,每个节点代表一个子区间的和、最小值、最大值等信息,......
  • 一些可以在线段树上维护的信息和修改
    信息最基础的信息之一:区间和\(sum=l.sum+r.sum\)最基础的信息之一:区间大小\(sz=l.sz+r.sz\)最基础的信息之一:区间最值\(minv=min(l.minv,r.minv)\)普通信息:最值个数if(l.minv<r.minv)minvcnt=l.minvcnt;elseif(r.minv<l.minv)minvcnt=r.minvcnt;......
  • 李超线段树
    李超线段树李超线段树发现要维护的问题十分难做,所以我们要引入李超线段树。我们发现,如果在一个区间内,一条线段的整体在另一条线段上方,那么这条线段一定更优,我们称之为最优线段。但是如果并不是这样,应该如何做呢?这里给出线段为一个区间内的最优线段的条件:线段的定义域覆盖了......
  • 中位数(权值线段树版)
    中位数题目描述给定一个长度为NNN的非负整数序列AAA,对于前奇数......
  • 线段树分治学习笔记
    线段树分治是一种通过线段树维护时间轴,实现一些可撤销的信息维护问题的手段。线段树分治是离线算法。具体地,对于若干个修改与询问,按照时间戳像区间修改一样挂在线段树的节点上,然后遍历整棵线段树,将节点上的操作计入贡献,对于一个时间戳为\(t\)的询问,线段树上区间\([t,t]\)即......
  • CF1864F Exotic Queries (离线+线段树+树状数组)
    CF1864FExoticQueries离线+线段树+树状数组先把权值在\([l,r]\)之内的单独拎出来看性质。可以知道策略一定是元素从小到大消成\(0\)。当消除元素\(x\)时,最好的情况当然是一次全消了,但一般元素\(x\)的位置两两之间会有之前消成的\(0\),将所有位置分成了\(n\)段,那么消......
  • openlayer, 由一个图标遮盖线段需求引发的思考
    最近碰到这么一个需求:有一些面(Polygon)和线(LineString),需要在面的边线上或者在线上均匀绘制一些矩形图标(在各种分辨率下)。在一个Polygon的边线或者LineString上绘制一个矩形图标时,图标会遮住线,如果图标是部分镂空的,就会看到线从图标中穿过,如何让图标看起来遮住了线呢,自然而然就会......
  • GLFLS课程:线段树进阶
    线段树合并与分裂线段树合并两个权值线段树\(T_1\)和\(T_2\)的合并是一个递归的过程。我们不妨设要合并的子树为\(x\)和\(y\),其对应区间均为\([l,\r]\)那么分类讨论如下:  \((1)\)首先若\(x=0\)或\(y=0\),则\(x\),\(y\)中有空节点,直接返回\(x+y\)即可......
  • 20240706总结(线段树应用)
    A-PhysicalEducationLessonsCF915EPhysicalEducationLessons题解:没什么好说的,动态开点模板题(好像普通线段树也可以做)B-GCDofanArrayCF1493DGCDofanArray题解:暴力分解质因数,修改的时候也把x分解,对每个质数开一个可重集合(multiset)记录一下每个质数出现的不同位......