首页 > 其他分享 >线段树合并

线段树合并

时间:2023-10-13 21:56:09浏览次数:31  
标签:maxx return int 合并 线段 tr id

P4556 [Vani有约会] 雨天的尾巴 /【模板】线段树合并

有 \(n(n≤10^5)\) 个点,形成树状结构。

有 \(m(m≤10^5)\) 次发放操作,每次选择两个点 \(x,y\) ,对 \(x\) 到 \(y\) 的路径上(包括 \(x,y\))的每个点发放一个 \(z(z≤10^5)\) 类型的物品。

求完成所有操作后,每个点存放最多的是哪种类型的物品。

思路:

每个点维护一个权值线段树,用差分修改,最后累加得出答案。

为保证空间复杂度,需要动态开点。

在最后累加差分时,需要线段树合并。

用权值线段树维护最大值 \(maxx\),以及最大值的编号 \(id\)

void pushup(int id) { 
    int lc = tr[id].ls, rc = tr[id].rs; 
    if (tr[lc].maxx >= tr[rc].maxx) { //左子树的id一定比右子树小
        tr[id].maxx = tr[lc].maxx;
        tr[id].id = tr[lc].id;
    }
    else {
        tr[id].maxx = tr[rc].maxx; 
        tr[id].id = tr[rc].id; 
    }
}

动态开点(每一次插入操作至多新开 \(\log n\) 个空间)

void insert(int &u,int l,int r,int pos,int v)
{
	if(!u)u=++cnt;
	if(l==r){
		tr[u].maxx+=v;
		tr[u].id=l;
		return;
	}
	int mid=l+r>>1;
	if(pos<=mid)insert(tr[u].ls,l,mid,pos,v);
	else insert(tr[u].rs,mid+1,r,pos,v);
	pushup(u);
}

线段树合并:

将一些线段树的值累加成一颗,并维护相应的值。

指针 \(p,q\) 分别从两颗线段树的根节点出发,分别向下递归。

若 \(p,q\) 之一为空,则直接替换。

否则递归左右子树,删除节点 \(q\)

最多合并 \(n-1\) 次,每次复杂度 \(O(\log n)\)

int merge(int p,int q,int l,int r)
{
	if(!p)return q;
	if(!q)return p;
	if(l==r){
		tr[p].maxx+=tr[q].maxx;
		return p;
	}
	int mid=l+r>>1;
	tr[p].ls=merge(tr[p].ls,tr[q].ls,l,mid);
	tr[p].rs=merge(tr[p].rs,tr[q].rs,mid+1,r);
	pushup(p);
	return p;
}

标签:maxx,return,int,合并,线段,tr,id
From: https://www.cnblogs.com/lzaqwq/p/17763341.html

相关文章

  • 将尚未推送的Git合并操作撤销
    内容来自DOChttps://q.houxu6.top/?s=将尚未推送的Git合并操作撤销我不小心在我的本地master分支上运行了gitmergesome_other_branch。我没有将更改推送到originmaster。如何撤销合并?合并后,gitstatus显示:#在master分支上#您的分支比'origin/master'领先5个提交。......
  • CODING 界面全新升级,代码仓库 Rebase 变基合并、批量复制事项等功能上线!
    点击链接了解详情金秋十月,腾讯云CODINGDevOps焕新上线!本次更新,我们不仅推出了全新的用户界面,还推出了一系列重磅产品能力,满足广大用户的日常研发与协作所需。以下是CODING新功能速递,快来看看是否有您期待已久的功能特性:01CODING界面焕新上线,“效率”+“体验”双重升......
  • MySQL的index merge(索引合并)导致数据库死锁分析与解决方案 | 京东云技术团队
    背景在DBS-集群列表-更多-连接查询-死锁中,看到9月22日有数据库死锁日志,后排查发现是因为mysql的优化-indexmerge(索引合并)导致数据库死锁。定义indexmerge(索引合并):该数据库查询优化的一种技术,在mysql5.1之后进行引入,它可以在多个索引上进行查询,并将结果合并返回。mysql数据库的......
  • 几何计算-基于Turf.js实现多边形的拆分及合并
    几何计算-基于Turf.js实现多边形的拆分及合并阿飞​红星美凯龙3D前端开发工程师​关注他 10人赞同了该文章❝JSAPIGL近期为支持物流行业实现了几何图形编辑器,用户可通过编辑器接口进行点、线、面、圆的绘制和编辑。在物流行业中常见的使用场景......
  • MySQL的index merge(索引合并)导致数据库死锁分析与解决方案
    背景在DBS-集群列表-更多-连接查询-死锁中,看到9月22日有数据库死锁日志,后排查发现是因为mysql的优化-indexmerge(索引合并)导致数据库死锁。定义indexmerge(索引合并):该数据库查询优化的一种技术,在mysql5.1之后进行引入,它可以在多个索引上进行查询,并将结果合并返回。mysql数......
  • Shell(五):文件的排序、合并和分割
    Linux文本处理命令是Shell编程中的常用命令,文本处理包含对文件记录的排序、文件的合并和分割等。1、sort命令sort命令是一种对文件排序的工具,sort命令将输入文件看做由多条记录组成的数据流,而记录由可变宽度的字段组成,以换行符作为定界符。sort命令,可将记录分成多......
  • 盘点一个多Excel表格数据合并的实战案例
    大家好,我是皮皮。一、前言前几天在Python最强王者交流群【哎呦喂是豆子~】问了一个Python自动化办公的问题,一起来看看吧。大佬们请问下这个数据怎么实现存在n个dataframe数据,想把数据写到同一个工作簿同一个sheet里面的,但是一直数据追加不成功,然后我试着写到同一个工作簿不......
  • git-线上分支合并
    1.线上分支合并1.线下分支合并:gitmergedev2.线上分支合并:-公司有个主分支---》只保留大版本信息,真正的开发在dev分支开发-你开发的代码,提交到dev的分支了,功能写完了,要给用户看了,把dev分支合并到主分支-线上分支合并:提交:-pr:pull......
  • gitlab、线上合并分支、远程仓库回滚、git工作流,git pull和git fetch,变基、pycharm操
    gitlab使用1、创建账号---》管理员审核2、登录进去---》就能看到项目--(项目管理员把你添加成开发者了)3、把代码clone下来,使用pycharm打开4、写代码,本地提交问题:普通开发者,提交到master分支是不行的创建一个dev分支---》提交到dev分支后期由管理员做分支合并--......
  • idea git 合并分支(从分支A合并到master)
    ideagit合并分支注意:其中图片可能与最新的idea版本有些出入,不要纠结1.为什么要建立分支git默认的主分支名字为master,一般团队开发时,都不会在master主分支上修改代码,而是建立新分支,测试完毕后,在将分支的代码合并到master主分支上。2.操作如下:2.1ideagit分支的操作idea......