像使用stl一样使用线段树 ——AtCoder Library(转载https://zhuanlan.zhihu.com/p/459579152)
地址:https://zhuanlan.zhihu.com/p/459579152
我这里翻译一下官方的文档。
首先需要满足几个性质。
(注意 ∗ 是个操作,不是单纯的一个乘号)
1)操作满足结合律 即 (a∗b)∗c=a∗(b∗c)
2)操作需要有个幺元(基本元/单位元) a∗e=e∗a=a
如果你有这个一个序列 S,长度为 N ,接下来的两个询问的操作的复杂度为 O(logN)
1)更新序列中的一个元素
2)计算区间的 ∗
需要注意的是,如果你的 ∗ 这个操作自带一个复杂度 O(T) ,最后的复杂度的计算要乘上他。
构造一个线段树(俗称build)
1)segtree<S, op, e> seg(int n)
2)segtree<S, op, e> seg(vector<S> v)
这里我们需要一个操作 op 和一个 幺元 e 。
1)的方法可以让我们构造一个长度为n的线段树,初始值为幺元e (下标从0开始
2)的方法可以让我们构造一个长度为v.size()的线段树,初始值为vector (下标从0开始
op函数的形式应该为 (这里S表示这个元素的类型
S op(S a, S b)
e的函数形式应该为
S e()
举个例子。
int op(int a, int b) {
return min(a, b);
}
int e() {
return (int)(1e9);
}
segtree<int, op, e> seg(10);
这样我们定义了一个操作为min,幺元为 1e9 (很明显 min(x,1e9) = x ),的长度为10的线段树,初始值为1e9。
构造(build)的复杂度为O(N)
//这样的一个线段是就是 单点修改 区间查询最小的一个线段树。
接下来介绍操作。
void seg.set(int p, S x)
将 a[p] 赋值为 x
复杂度为 o(logN)
S seg.get(int p)
返回 a[p]
复杂度为 o(1)
S seg.prod(int l, int r)
返回op(a[l], ..., a[r - 1]) 结果(注意是[L,R) 前闭后开)
复杂度o(logN)
S seg.all_prod()
返回op(a[0], ..., a[n - 1]) 。
复杂度为O(1)
这里还有一个树上二分的操作,我就讲一个吧。
(1)int seg.max_right<f>(int l)(2)int seg.max_right<F>(int l, F f)
这里f的形式应该为
bool f(S x)
返回一个 r 满足
f(op(a[l],a[l+1],...,a[r-1])) = true,f[a[r]] = false;
举个例子。
像使用stl一样使用线段树 ——AtCoder Library(转载https://zhuanlan.zhihu.com/p/459579152)的更多相关文章
- 线段树总结 (转载 里面有扫描线类 还有NotOnlySuccess线段树大神的地址)
转载自:http://blog.csdn.net/shiqi_614/article/details/8228102 之前做了些线段树相关的题目,开学一段时间后,想着把它整理下,完成了大牛NotOnl ...
- HDU 1166 - 敌兵布阵 - [单点修改、区间查询zkw线段树]
题还是那个题:http://www.cnblogs.com/dilthey/p/6827959.html 不过我们今天换一种线段树实现来做这道题: 关于zkw线段树的讲解:https://zhuanl ...
- 14-敌兵布阵(HDU1166线段树 & 树状数组)
http://acm.hdu.edu.cn/showproblem.php?pid=1166 敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory ...
- hdu1394Minimum Inversion Number(线段树,求最小逆序数)
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- bzoj 4695 最假女选手 吉利线段树
最假女选手 Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 480 Solved: 118[Submit][Status][Discuss] Desc ...
- bzoj 1828: [Usaco2010 Mar]balloc 农场分配【贪心+线段树】
长得挺唬人的贪心,按照右端点排序,用最小值线段树的询问判断当前牛是否能放进去,能的话更新线段树,ans++ 来自https://www.cnblogs.com/rausen/p/4529245.htm ...
- 线段树详解 (原理,实现与应用)(转载自:http://blog.csdn.net/zearot/article/details/48299459)
原文地址:http://blog.csdn.net/zearot/article/details/48299459(如有侵权,请联系博主,立即删除.) 线段树详解 By 岩之痕 目录: 一:综述 ...
- 线段树初步——转载自ljc20020730
线段树初步 线段树模板1:https://www.luogu.org/problem/show?pid=3372 线段树模板2:https://www.luogu.org/problem/show ...
- 牛客wannafly 挑战赛14 B 前缀查询(trie树上dfs序+线段树)
牛客wannafly 挑战赛14 B 前缀查询(trie树上dfs序+线段树) 链接:https://ac.nowcoder.com/acm/problem/15706 现在需要您来帮忙维护这个名册, ...
- 2019牛客多校第一场 I Points Division(动态规划+线段树)
2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有 ...
随机推荐
- 19c ADG Switchover 切换测试
背景: 环境未配置DG Broker,手工切换ADG,19c也要比11g时代的切换更简单. 使用自己的测试环境,具体可参见: 单实例Primary快速搭建Standby RAC参考手册(19.16 A ...
- 17.5 稀疏调拨的内存映射文件--《Windows核心编程》
原文链接:https://www.likecs.com/show-306421749.html,原文中代码是C++MFC程序,更详细.本文是C语言测试代码. (1)稀疏文件(Sparse File)定 ...
- Spring Boot 单元测试笔记
1. 导入JUnit5测试框架 <dependency> <groupId>org.springframework.boot</groupId> <artif ...
- Ubuntu安装PHP和NGINX环境
Ubuntu安装PHP和NGINX环境 介绍 PHP-FPM PHP-FPM 是 PHP FastCGI Process Manager 的缩写,是 FastCGI 进程管理器. PHP-FPM 是基 ...
- NC50505 二叉苹果树
题目链接 题目 题目描述 有一棵二叉苹果树,如果数字有分叉,一定是分两叉,即没有只有一个儿子的节点.这棵树共N个节点,标号1至N,树根编号一定为1. 我们用一根树枝两端连接的节点编号描述一根树枝的位置 ...
- NC51216 花店橱窗
题目链接 题目 题目描述 小q和他的老婆小z最近开了一家花店,他们准备把店里最好看的花都摆在橱窗里. 但是他们有很多花瓶,每个花瓶都具有各自的特点,因此,当各个花瓶中放入不同的花束时,会产生不同的美学 ...
- SSL证书类型价格和购买
SSL证书 SSL和HTTPS的工作机制就不多说了, 密钥交换加通道依然是非常靠谱的安全访问方式, 除非你的浏览器连证书和DNS都被劫持, 否则中间节点要解密/篡改HTTPS访问的可能性微乎其微. 现 ...
- Vue中虚拟DOM的理解
Vue中虚拟DOM的理解 Virtual DOM是一棵以JavaScript对象作为基础的树,每一个节点称为VNode,用对象属性来描述节点,实际上它是一层对真实DOM的抽象,最终可以通过渲染操作使这 ...
- 关于动态抽样(Dynamic Sampling)
关于动态抽样(Dynamic Sampling) 原文:http://www.oracle.com/technetwork/issue-archive/2009/09-jan/o19asktom-08 ...
- 在Windows10中安装解压版MySQL 8.X
在Windows 10中安装解压版的MySQL 8.X实现步骤: 1.下载MySQL安装包:https://dev.mysql.com/downloads/mysql/ 解压到指定目录,比如:D:\o ...