地址: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. (1)int seg.max_right<f>(int l)
  2. (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)的更多相关文章

  1. 线段树总结 (转载 里面有扫描线类 还有NotOnlySuccess线段树大神的地址)

    转载自:http://blog.csdn.net/shiqi_614/article/details/8228102 之前做了些线段树相关的题目,开学一段时间后,想着把它整理下,完成了大牛NotOnl ...

  2. HDU 1166 - 敌兵布阵 - [单点修改、区间查询zkw线段树]

    题还是那个题:http://www.cnblogs.com/dilthey/p/6827959.html 不过我们今天换一种线段树实现来做这道题: 关于zkw线段树的讲解:https://zhuanl ...

  3. 14-敌兵布阵(HDU1166线段树 & 树状数组)

    http://acm.hdu.edu.cn/showproblem.php?pid=1166 敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  4. hdu1394Minimum Inversion Number(线段树,求最小逆序数)

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

  5. bzoj 4695 最假女选手 吉利线段树

    最假女选手 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 480  Solved: 118[Submit][Status][Discuss] Desc ...

  6. bzoj 1828: [Usaco2010 Mar]balloc 农场分配【贪心+线段树】

    长得挺唬人的贪心,按照右端点排序,用最小值线段树的询问判断当前牛是否能放进去,能的话更新线段树,ans++ 来自https://www.cnblogs.com/rausen/p/4529245.htm ...

  7. 线段树详解 (原理,实现与应用)(转载自:http://blog.csdn.net/zearot/article/details/48299459)

    原文地址:http://blog.csdn.net/zearot/article/details/48299459(如有侵权,请联系博主,立即删除.) 线段树详解    By 岩之痕 目录: 一:综述 ...

  8. 线段树初步——转载自ljc20020730

    线段树初步   线段树模板1:https://www.luogu.org/problem/show?pid=3372 线段树模板2:https://www.luogu.org/problem/show ...

  9. 牛客wannafly 挑战赛14 B 前缀查询(trie树上dfs序+线段树)

    牛客wannafly 挑战赛14 B 前缀查询(trie树上dfs序+线段树) 链接:https://ac.nowcoder.com/acm/problem/15706 现在需要您来帮忙维护这个名册, ...

  10. 2019牛客多校第一场 I Points Division(动态规划+线段树)

    2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有 ...

随机推荐

  1. ICLR 2024 | Mol-Instructions: 面向大模型的大规模生物分子指令数据集

    Mol-Instructions: 面向大模型的大规模生物分子指令数据集 发表会议:ICLR 2024 论文标题:Mol-Instructions: A Large-Scale Biomolecula ...

  2. Android Graphics 显示系统 - 如何模拟多(物理)显示屏?

    " 本着花小钱办大事,不花钱也办事的原则,为了避免花钱买设备,那如何更便捷地学习/测试Android多屏显示的内容呢?本文就给大家介绍一种模拟Android多个物理屏幕显示的方法." ...

  3. 一句话总结Docker与K8S的关系

    一句话总结:Docker只是容器的一种,它面向的是单体,K8S可以管理多种容器,它面向的是集群,Docker可以作为一种容器方案被K8S管理.下文继续具体介绍. 1.容器的核心概念 介绍这几个核心概念 ...

  4. Oracle多租户架构之如何快速创建一个PDB

    Oracle自从12c版本开始引入多租户的架构,整个管理理念也发生了很大的变化. 比如之前再小的业务只要选择了Oracle,DBA都会选择新建一套独立的数据库,因为传统的架构只能在schema级别作区 ...

  5. Flink CDC写入数据到kafka几种格式

    Flink CDC写入kafka几种常见的数据格式,其中包括upsert-kafka写入后正常的json格式,debezium-json格式以及changelog-json格式. upsert-kaf ...

  6. 树莓派安装freeswitch

    树莓派版本: Raspberry Pi 4B 操作系统 : Ubuntu Server 20.04_x64 freeswitch版本 : 1.10.3 1.下载freeswitch源代码 wget h ...

  7. NC210981 mixup2混乱的奶牛

    题目链接 题目 题目描述 混乱的奶牛 [Don Piele, 2007] Farmer John的 N(4 <= N <= 16) 头奶牛中的每一头都有一个唯一的编号 \(S_i (1 & ...

  8. Ubuntu下SSH管理及SFTP下载工具Muon(Snowflake)

    简介 Muon其实更像是一个基于ssh的服务器管理工具, 界面中有PAC Manager的影子, 集成了文件管理, ssh命令行, 服务器性能监测和工具包等功能. 因为这个工具的编写语言是Java, ...

  9. 【framework】Activity启动流程

    1 前言 ATMS启动流程 介绍了 ActivityTaskManagerService(ATMS)的启动和初始化流程,本文将介绍 Activity 的启动流程.由于 Activity 启动流程复杂, ...

  10. spring boot中使用定时任务

    1.在主类上添加EnableScheduling注解 package com.laoxu.gamedog; import org.springframework.boot.SpringApplicat ...