首页 > 其他分享 >吉老师线段树学习笔记(内含吉老师ppt)

吉老师线段树学习笔记(内含吉老师ppt)

时间:2023-05-02 20:44:46浏览次数:50  
标签:rt int 老师 线段 最大值 ppt 区间 mx

Segment tree beats

吉老师线段树

Segment tree Beats!.pdf_免费高速下载|百度网盘-分享无限制 (baidu.com)

为广大oier们提供学习ppt(笑)

历史最大值未完工

作用

用于维护区间最值和区间历史最值的线段树

区间最值

引入

问题

给定一个长度为n的数列A,有m次操作:

1.将区间\([l,r]\)里面的数\(a[i]=min(a[i],x)\)

2.询问区间\([l,r]\)中所有数的和

思路

case1:\(n,m\leq 5e4\)直接分块搞!

case2:\(n,m\leq 5e5\)线段树

我们发现最基本的线段树是没办法做到这个东西的修改操作的

在吉老师的ppt中写到,类比某道区间取模的题目,我们每一次找出这个区间的最大值mx,如果mx>x,就暴力修改这个位置的值,否则修改完毕,直接退出,发现时间复杂度是\(O(n^2logn)\),我们不能接受

继续试着深入一下,于是就有了吉老师线段树

正文

对于线段树,我们维护以下几个东西:

  1. 区间最大值mx
  2. 最大值在区间内出现次数cnt
  3. 区间次大值se
  4. 区间和sum

现在开始考虑打标记x(区间取min):

  1. case1:mx<=x,结合初步思想,对于整体没有影响
  2. case2:se<x<mx,那么sum=sum-(mx-x)*t
  3. case3:x<=se,不能直接计算出答案,我们分别dfs这个rt(当前)节点的两个孩子,如果当前dfs的过程中出现了前两种情况,我们打上标记后退出,否则继续

这个就是吉老师线段树的整体思想

时间复杂度是O(nlogn),证明在论文里面(ppt也有),我没有找到qwq

代码

struct SegTree{
	struct Node{
		int mx,cnt,se;
		//最大值,最大值出现次数,次大值 
		int sum,lazy;
	}t[M];
	void push_up(int rt){
		if(t[ls].mx<t[rs].mx){
			t[rt].mx=t[rs].mx;
			t[rt].cnt=t[rs].cnt;
			t[rt].se=max(t[rs].se,t[ls].mx);
		}else{
			if(t[ls].mx>t[rs].mx){
				t[rt].mx=t[ls].mx;
				t[rt].cnt=t[ls].cnt;
				t[rt].se=max(t[ls].se,t[rs].mx);
			}else{
				t[rt].mx=t[rs].mx;
				t[rt].cnt=t[rs].cnt+t[ls].cnt;
				t[rt].se=max(t[rs].se,t[ls].se);
			}
		}
		t[rt].sum=t[rs].sum+t[ls].sum;
	}
	void modify(int rt,int x){
		if(t[rt].mx<=x)return;
		t[rt].sum-=t[rt].cnt*(t[rt].mx-x);
		t[rt].mx=t[rt].lazy=x;
	}
	void push_down(int rt){
		if(t[rt].lazy!=-1){
			dfs(ls,t[rt].lazy);
			dfs(rs,t[rt].lazy);
			t[rt].lazy=-1;
		}
	}
	void build(int l,int r,int rt){
		t[rt].lazy=-1;
		if(l==r){
			t[rt].sum=t[rt].mx=a[l];
			t[rt].se=-1;
			t[rt].cnt=1;
			return;
		}
		int mid=(l+r)>>1;
		build(l,mid,ls);
		build(mid+1,r,rs);
		push_up(rt);
	}
	void update(int rt,int l,int r,int L,int R,int val){
		if(t[rt].mx<=val)return;
		if(L<=l&&r<=R){
			dfs(rt,val);
			return;
		}
		push_down(rt);
		int mid=(l+r)>>1;
		if(L<=mid)update(ls,l,mid,L,R,val);
		if(R>mid)update(rs,mid+1,r,L,R,val);
	}
	//相信查询区间最大值和区间和大家都会写了,我就懒得写了 
};

new problem1

给定一个长度为n的数列A,有m次操作:

1.将区间\([l,r]\)里面的数\(a[i]=min(a[i],x)\)

2.询问区间\([l,r]\)中所有数的和

3.区间[l,r]的所有数加上x(x可能为负数)

我们直捣黄龙,看一下线段树怎么搞

对于线段树,我们依旧维护那几个值用于解决操作1和操作3,但是现在多了一个操作2好像没什么大问题

时间复杂度

哇去,我还没有学势能分析!我不会!(真诚恳的说)

咕咕咕(我要是高一还在学oi的话说不定可以补一下)

new problem2

给定一个长度为n的数列A,有m次操作:

1.将区间\([l,r]\)里面的数\(a[i]=min(a[i],x)\)

2.将区间\([l,r]\)里面的数\(a[i]=max(a[i],x)\)

3.查询区间和

可以发现和最初的问题很相似,所以类比一下:

  1. 对于线段树,我们维护:最大值mx,最小值mn,出现次数分别为cnt1和cnt2,次大值分别是se1和se2
  2. 我们的lazy标记是可以合并的,所以接下来的就和问题1相似了!
  3. 参照初始问题

历史最值

虽然这里已经和我的训练列表没有任何关系了,但是我还是要写完

先咕咕咕一天吧

引入

问题

给定一个长度为n的数列A,有m次操作:

1.区间\([l,r]\)中的所有数加上x

2.区间\([l,r]\)中的所有数变成\(max(a[i]-x,0)\)

3.区间\([l,r]\)中所有数变成x

4.查询\(a_i\)的值

5.查询\(a_i\)的历史最大值

思路

我们要支持的操作只有一个:给区间中所有数加上x然后和y取max,我们记作(x,y)

那么这三个操作分别为: \((x,inf),(-x,0),(-inf,x)\)

考虑合并两个标记\((a,b),(c,d)\),结果是\((a+c,max(b+c,d))\)

然后标记合并,操作1到操作4全部都over了

对于操作5:我们对于线段树的每一个节点,额外记录一个历史最大标记(即区间中元素在使用这个标记后是上一次标记传到这里的最大值),参考cpu监控

正文

问题在于维护这个历史最大标记:

  1. 用每一时刻的标记来更新历史最大标记(在push_down时,令父亲节点的历史最大标记为p,当前节点为q,历史最大标记为w,那么我们要用p+q取更新w)

标签:rt,int,老师,线段,最大值,ppt,区间,mx
From: https://www.cnblogs.com/Zhangrx-/p/17368235.html

相关文章

  • 线段树合并/分裂
    你说的对,但是你理应会动态开点线段树是什么东西。合并很简单,两棵线段树一块搜,然后逐个节点合并。分裂的话可以按照FHQTreap的方法。假如我们将前\(k\)小和后边分开成\(x,y\),首先看左子树,如果比\(k\)大那右子树给\(y\),递归左子树,反之左子树给\(x\),递归右子树。真没啥......
  • java基于springboot的毕业生信息招聘平台、高校学生招聘管理系统、招聘管理系统,附源码
    1、项目介绍毕业生信息招聘平台的功能如下:管理管理员;首页、个人中心、企业管理、空中宣讲会管理、招聘岗位管理、毕业生管理、个人简历管理、求职信息管理、信息咨询管理、岗位应聘管理、线上面试管理、面试回复管理、试卷管理、试题管理、管理员管理、论坛管理、系统管理、考试......
  • java基于springboot的学生毕业离校系统管理系统、高校学生离校管理系统,附源码+数据库+
    1、项目介绍学生毕业离校系统的开发过程中,采用B/S架构,主要使用Java技术进行开发,结合最新流行的springboot框架。中间件服务器是Tomcat服务器,使用Mysql数据库。该学生毕业离校系统包括管理员、学生和教师。其主要功能包括管理员:首页、个人中心、学生管理、教师管理、离校信息管......
  • 区间不同数的个数 二维数点 扫描线 可持久化线段树
    二维数点,对于询问的\([l,r]\)区间我们只需要统计有多少个数上一次出现的位置\(pos\)满足\(pos\leql\),即可。template<classT>structBIT{Tc[N];intsize;voidresize(ints){size=s;}Tquery(intx){//1...xassert(x<=size);......
  • 小鹅通视频课件课程下载工具,如何在电脑端下载小鹅通频课件PDF,PPT到本地
    一.安装小鹅通下载器1.获取学无止下载器https://www.xuewuzhi.cn/xiaoetech_downloader2.下载安装后,然后点击桌面快捷方式运行即可。注意:杀毒软件可能会阻止外部exe文件运行,并将其当做成病毒,直接添加信任即可,本软件绝对没有木马病毒。二.使用说明1.学无止下载器介绍学无......
  • 权值线段树模板
    【模板】普通平衡树//AConemoretimes#include<bits/stdc++.h>usingnamespacestd;#definefifirst#definesesecond#definepbpush_back#defineendl'\n'#defineall(x)(x).begin(),(x).end()typedefpair<int,int>pii;constint......
  • 线段树
     1.基础算法1.1快读快写template<typenameT>inlinevoidread(T&t){​ intf=0,c=getchar();t=0;​ while(!isdigit(c))f|=c=='-',c=getchar();​ while(isdigit(c))t=t*10+c-48,c=getchar();​ if(f)t=-t;​}​​templ......
  • 线段树的动态开点模板
    学习自数据结构学习笔记(5)动态开点线段树动态开点线段树感谢大佬们博客的帮助//AConemoretimes#include<bits/stdc++.h>usingnamespacestd;#definefifirst#definesesecond#definepbpush_back#defineendl'\n'#defineall(x)(x).begin(),(x).end()......
  • 009 PPT 添加音频
    操作步骤:1.插入/音频2.插入音频后,可对音频进行设置动画==》动画窗格==》效果选项,如下所示: ......
  • 007 PPT 实现限制修改
    方法一:将PPT另存为——PPT图片演示文稿(PPT将以图片的形式展现)方法二:为PPT加密,即修改时,需输入密码后方可修改,否则只读WPS==>文件/文档加密,设置密码即可PPT2016==》文件/另存为/工具/常规选项,如下图所示: ......