首页 > 其他分享 >线段树另一半家桶

线段树另一半家桶

时间:2024-12-29 22:10:25浏览次数:5  
标签:return rs int 线段 mid 一个 家桶 另一半

前一半家桶

常年做数据结构的人都目光呆滞,极度自卑,后面忘了。

线段树分裂

就是裂开,咋合的就咋裂开,进而和线段树合并类似地,这个东西用于权值线段树的操作。然后线段树合并和线段树分裂一般同时出现,空间炸炸的,这个时候就要写垃圾桶,就是把没用的节点编号扔到一个栈里头。

	inline int merge(int x,int y,int l,int r){
		if(!x||!y)return x^y;
		if(l==r){
			tree[x].val+=tree[y].val;
			del(y);
			return x;
		}
		int mid=l+r>>1;
		ls(x)=merge(ls(x),ls(y),l,mid);
		rs(x)=merge(rs(x),rs(y),mid+1,r);
		push_up(x);
		del(y);
		return x;
	}
	inline void split(int &x,int &y,int l,int r,int ul,int ur){
		if(r<ul||l>ur)return ;
		if(!x)return ;
		if(l>=ul&&r<=ur){
			y=x;
			x=0;
			return ;
		}
		if(!y)y=newnode();
		int mid=l+r>>1;
		if(ul<=mid)split(ls(x),ls(y),l,mid,ul,ur);
		if(ur>mid)split(rs(x),rs(y),mid+1,r,ul,ur);
		push_up(x);
		push_up(y);
	}

码长这个样子,就是说从 \(x\) 树中裂出一个值域为 \([l,r]\) 的小树 \(y\),每次遇到小树范围内的节点就给它抢过来(y=x,x=0)。

这个题就是说每个multiset就是一个 \(rt\),然后你分分合合一下。

排序

就是说一个升降序段就是一个权值线段树,每次排序可能会撞到之前排好序的位置,这个时候就拿set维护一下排好序的区间端点然后直接找,找完分裂。

CF911G

这个还挺一眼的,发现 \(a_i\) 特别小所以直接开100个线段树维护数组下标,每次把 \(x\) 线段树的 \([l,r]\) 下标分裂后合并到 \(y\) 线段树上。

线段树优化建图

普遍是容易的。

CF786B

板。

炸弹

处理出每个蛋能影响到的区间,线段树优化连边,然后发现会成环所以跑塔尖缩点。有个假做法是在这张dag上跑计数dp,然而一个点可能有多个出边并在之后汇合到一点,考虑到一个蛋最终能影响到的一定是一个连续段的形式,转而维护scc间能覆盖的最左最右位置即可,这样是可以跑拓扑序bfs的。

PUS

跑一个差分约束,\(u>v =u\rightarrow v\) 有环无解,无环为最短路。

但是这里的连边是一坨连向一坨形式的,此时有一个trick就是超级节点,就是开一个新节点 \(p\) 使得边集 \(E=\{(u_i,v_j,w)\}\) 变成 \(E'=\{(u_i,p,w)\}\cup\{(p,v_i,w)\}\) 这样边数就从 \(O(n^2)\) 变成 \(O(n)\) 了,然后分别开出入边线段树优化建图(但是这个题一边的点特别少,所以可以开一个线段树,少的暴力连边)。

线段树分治

这一段先跳过,因为学校oj的cf炸了。

线段树二分

线段树长得就很二分,这样可以把一些看起来唐唐的 \(O(nlog^2n)\) 变成看起来牛牛的 \(O(nlogn)\)。但是这块没啥题。

Siano

有一个容易得到但是我没得到的性质就是说长得快的在一个切割的时间段一定不低,可以分讨一下 \(a_j>a_i\),如果 \(ij\) 都切了那就是一样高,\(j\) 切了 \(i\) 没切那肯定 \(j=b,i\le b\),\(i\) 切了 \(j\) 没切是不存在的,能发生这种情况说明 \(j\) 先前被砍到了一个以它的速度不能弥补的高度差(并且j更矮),但是 \(j\) 是一定长的快的,所以那一次 \(i\) 也一定被砍了,所以就有问题了。

这样的话按生长速度重排一下。每次先打一个生长tag,这样一定有一个后缀(前缀)段是一起高于\(b\) 的,二分出这个段然后贡献,覆盖即可。

永无乡

这不是我们线段树合并的梗吗。确实没太明白哪要二分,可能是kth吧,总之很牵强。

标签:return,rs,int,线段,mid,一个,家桶,另一半
From: https://www.cnblogs.com/Claimo0611/p/18639660

相关文章

  • 线段树学习
    线段树简而言之:就是层数是log2(n)的树,然后用来快速求其中的区间和代码publicclassSegmentTree{privateint[]tree;privateintn;publicSegmentTree(int[]arr){n=arr.length;tree=newint[4*n];buildTree(arr,0......
  • 洛谷题单指南-线段树的进阶用法-P3834 【模板】可持久化线段树 2
    原题链接:https://www.luogu.com.cn/problem/P3834题意解读:静态区间第k小问题,可持久化线段树(也称为主席树)模版题。解题思路:一、朴素想法:如何求完整区间[1,n]第k小1、权值线段树设n个数构成序列a,b数组代表a中元素出现的次数,即b数组的构建方式为对每一个a[i]做b[a[i]]++。针对b......
  • P3924 康娜的线段树
    P3924康娜的线段树题目描述小林是个程序媛,不可避免地康娜对这种人类的“魔法”产生了浓厚的兴趣,于是小林开始教她OI。今天康娜学习了一种叫做线段树的神奇魔法,这种魔法可以维护一段区间的信息,是非常厉害的东西。康娜试着写了一棵维护区间和的线段树。由于她不会打标记,因此所......
  • 就像STL那样:封装的动态开点线段树(用于线段树合并)
    Preface起因是这个万恶的\(P9067\),一个数据结构题,当时才搞了01字典树的板子,想\(trytry\)合并的题的,然后就搜到了这道。(虽然最后完全和这个没有关系)。然后感觉用线段树合并做就可以了,于是抄了个之前封装的一个板子,但是一点都不好用(sad)。空间方面又是头疼,感觉封装了又好像没有封装......
  • 线段树1模板 (洛谷p3372)
    关键在于创建一个向上返回的函数up,向下查询的同时将父亲sum和add值传给儿子函数down最后用lazy函数更新sum和add的值先通过build函数是sum数组完成初始化,然后用adds已经quiey函数完成求解,详细注释见代码​#include<iostream>#include<cstdio>usingnamespacestd;intm......
  • JMeter 线程组全家桶教程
    宝子们,今天咱就来唠唠JMeter里那些超重要的线程相关的玩意儿,学会了它们,你就能在性能测试的世界里“横冲直撞”啦!一、线程组——性能测试的主力军想象一下,你开了一家超级火爆的奶茶店,门口排着好多人等着买奶茶,这些人就相当于JMeter里的线程,而把这些人管理起来的队伍就是......
  • 人工智能系列算法‘’全家桶‘’分类,详细介绍!!!
    我们的人工智能算法‘’全家桶‘’:监督学习算法线性回归:用于建立自变量和因变量之间的线性关系模型,通过最小化预测值与真实值之间的误差平方和来确定模型参数,常用于预测数值型数据,如房价预测、销售额预测等1。逻辑回归:一种分类算法,用于解决二元分类问题,通过将线性回归的结果......
  • 经典区间线段树详解:从原理到实践
    线段树(SegmentTree)是一种非常高效的树形数据结构,用于解决区间查询和修改问题。本文将通过分步骤讲解,带领读者熟练掌握线段树的原理与实现,并探索其应用场景。引言:数组区间修改问题在一些经典问题中,比如给定一个数组,频繁地需要进行以下操作:区间查询:查询数组某一子区间内的最大......
  • 多项式全家桶
    多项式全家桶多项式求逆给定多项式\(f(x)\),求\(f^{-1}(x)\)。首先,易知\[[x^0]f^{-1}(x)=([x^0]f(x))^{-1}\]假设已经求出\(f(x)\)在模\(x^{\lceil\frac{n}2\rceil}\)意义下的逆元\(f_0^{-1}(x)\)。\[f(x)f_0^{-1}(x)\equiv0\pmod{x^{\lceil\frac{n}2\rceil}}\\f(x)......
  • 计算几何模板1(点,直线,线段以及之间的相互关系)
    带样例测试可以直接拿来用#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;constdoublepi=acos(-1);//圆周率π精确到15位小数3.141592653589793constdoubleeps=1e-8;//控制精度视题目情况具体情况具体取有的要取到1e-91e-10不......