首页 > 其他分享 >像使用stl一样使用线段树 ——AtCoder Library(转载https://zhuanlan.zhihu.com/p/459579152)

像使用stl一样使用线段树 ——AtCoder Library(转载https://zhuanlan.zhihu.com/p/459579152)

时间:2023-12-01 11:14:02浏览次数:44  
标签:AtCoder stl 复杂度 seg int 操作 zhihu 线段 op

地址: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;

举个例子。

标签:AtCoder,stl,复杂度,seg,int,操作,zhihu,线段,op
From: https://www.cnblogs.com/fishcanfly/p/17869266.html

相关文章

  • java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.LoopTag问题的解决
    问题描述问题解决将这个依赖:改成这个依赖:......
  • Atcoder-Countings4
    Atcoder-Countings4[ABC231G]BallsinBoxesProblem有\(n\)个盒子,初始时第\(i\)个盒子内有\(a_i\)个小球,进行\(k\)次操作后,每次操作等概率随机选择一个盒子放入一个小球,设\(k\)次操作后每个盒子的小球个数为\(b_i\),那么得分为\(\prod_{i=1}^nb_i\)。求出期望得分......
  • AtcoderDP1
    AtcoderDP1收录非计数dp题。[ABC227F]TreasureHunting(2323)Problem给你一个\(N\timesM\)的矩阵,你需要从坐标\((1,1)\)走到坐标\((N,M)\)去,每次只能向右或者向下走。坐标\((i,j)\)的价值是\(A_{i,j}\)。我们定义一条路径的价值是,这条路径经过的坐标的前\(K\)......
  • STL之set
    STL之set木材仓库题目描述博艾市有一个木材仓库,里面可以存储各种长度的木材,但是保证没有两个木材的长度是相同的。作为仓库负责人,你有时候会进货,有时候会出货,因此需要维护这个库存。有不超过100000条的操作:进货,格式1Length:在仓库中放入一根长度为Length(不超过\(10^9\))......
  • AtCoder Beginner Contest 330
    B-MinimizeAbs1思维题题意:给定一个范围,你选择一个数,使得思路:如果A[i]在l,r中间,那么直接打印就行,如果不是就打印就近的usingnamespacestd;voidsolve(){ intn,l,r; cin>>n>>l>>r; for(inti=1;i<=n;i++){ intx; cin>>x; if(x<l){ cout<<l<<"......
  • stl标准库
    STL标准库1.STL概念为了建立数据结构和算法的一套标准,并且降低他们之间的耦合关系,以提升各自的独立性、弹性、交互操作性(相互合作性,interoperability),诞生了STL​STL(StandardTemplateLibrary,标准模板库),是惠普实验室开发的一系列软件的统称。现在主要出现在c......
  • AtCoder Beginner Contest 326
    A-2UP3DOWN#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongvoidsolve(){inta,b;cin>>a>>b;if(a<bandb-a<=2)cout<<"Yes\n";elseif(a>banda......
  • AtCoder Beginner Contest 322
    A-FirstABC2#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#definempmake_pairusingvi=vector<int>;usingpii=pair<int,int>;voidsolve(){intn;strings;cin>>n>>s;......
  • AtCoder 329. E - Stamp (搜索 + 思维
    importjava.util.Scanner;classMain{staticintn,m;staticStrings,t;staticStringBuilderox;/***思路:*思路的大门:题目要要求把x变成s,我们可以反过来,把s变成只有#的x,所以我们就有了思路*1.从前......
  • TOYOTA SYSTEMS Programming Contest 2023(AtCoder Beginner Contest 330)
    TOYOTASYSTEMSProgrammingContest2023(AtCoderBeginnerContest330)A-CountingPassesintmain(){IOS;cin>>n>>m;intans=0;rep(i,1,n)cin>>k,ans+=k>=m;cout<<ans;return0;}B-......