像使用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个点,每个点有 ...
随机推荐
- MangoDB相关文档阅读小结
以往直到现在我所负责的业务场景没有使用MangoDB的,不过对于NoSQL的流行以及兴趣,阅读了一些文档做了简单的了解.待后续需要使用时再深入研究. 本文不介绍具体的语法. 基本信息 类似Json的B ...
- 零基础入门Vue之画龙点睛——再探监测数据
追忆 上一节:零基础入门Vue之影分身之术--列表渲染&渲染原理浅析 虽然我深知,大佬告诉我"先学应用层在了解底层,以应用层去理解底层",但Vue的数据如何检测的我不得不去 ...
- ASP.NET Core分布式项目实战(详解oauth2授权码流程)--学习笔记
最近公司产品上线,通宵加班了一个月,一直没有更新,今天开始恢复,每日一更,冲冲冲 任务13:详解oauth2授权码流程 我们即将开发的产品有一个用户 API,一个项目服务 API,每个服务都需要认证授 ...
- kafka-Kafka3.4版本创建topic出现zookeeper is not a recognized option
问题描述:在linux云服务器上搭建了一套kafka3.0集群,然后按照以前的创建topic指令: ./kafka-topics.sh --zookeeper hadoop01:2181,hadoop ...
- NC20960 迪拜的超市
题目链接 题目 题目描述 forever97家住迪拜一环,因此有很多大大小小的商场. 迪拜一环有n个超市,分别在坐标轴[1,n]位置,forever97家在0这个位置. 由于日常开销巨大,所以Trot ...
- 轻松玩转Makefile | 基础用法
前言 本文通过几个简单的示例,可以快速了解Makefile的基本使用方法,适用于编译我们平时练习所编写的小量代码. 1. make命令 Makefile文件内容: all为目标,这里没有依赖的文件,这 ...
- 使用OpenWrt实现IPv6 DDNS
OpenWrt 增加 crontab 任务 在/root/crontab/ 目录下, 创建脚本 ddns.sh #!/bin/sh # 远程php脚本的URL地址 SERVICE_URL=http:/ ...
- 【Lua】Lua基础语法
1 Lua 简介 Lua 是一个小巧的脚本语言,用标准C语言编写而成,由巴西里约热内卢天主教大学的 Roberto Ierusalimschy.Waldemar Celes 和 Luiz Henr ...
- 虚拟化技术VirtualBox和vagrant基本使用
虚拟化技术VirtualBox和vagrant基本使用 1.首先安装VirtualBox 可以去官网下载 https://www.virtualbox.org/ 2.安装vagrant(根据自己电脑得 ...
- springboot和jquery.form.js实现监听文件上传进度
说明 文件上传作为程序开发最常用的功能之一,上传进度展示也是必须的.但是有时候进度并不准,进度100%了实际上后台尚未接收完毕,本篇就介绍如何利用jquery的form插件来实时反馈文件上传进度. 实 ...