首页 > 其他分享 >动态开点线段树

动态开点线段树

时间:2024-03-28 22:36:02浏览次数:17  
标签:node right val 线段 tag 动态 self left

求区间最值

import sys

sys.setrecursionlimit(1000000)


class Node:
    __slots__ = ["left", "right", "val", "tag"]

    def __init__(self, left=None, right=None, val=0, tag=0):
        self.left = left
        self.right = right
        self.val = val
        self.tag = tag


class Tree:
    def __init__(self):
        self.root = Node()

    def push_down(self, node):
        if not node.left:
            node.left = Node()
        if not node.right:
            node.right = Node()
        if node.tag == 0:
            return
        node.left.val = node.left.tag = node.tag
        node.right.val = node.right.tag = node.tag
        node.tag = 0

    def push_up(self, node):
        node.val = max(node.left.val, node.right.val)

    def update(self, node, l, r, ql, qr, val):
        if ql <= l and qr >= r:
            node.val = val
            node.tag = val
            return
        self.push_down(node)
        mid = l + r >> 1
        if ql <= mid:
            self.update(node.left, l, mid, ql, qr, val)
        if qr > mid:
            self.update(node.right, mid + 1, r, ql, qr, val)
        self.push_up(node)

    def query(self, node, l, r, ql, qr):
        if ql <= l and qr >= r:
            return node.val
        self.push_down(node)
        mid = l + r >> 1
        ans = 0
        if ql <= mid:
            ans = self.query(node.left, l, mid, ql, qr)
        if qr > mid:
            ans = max(ans, self.query(node.right, mid + 1, r, ql, qr))
        return ans


lst = [0, 1, 2, 3, 4, 5]

mytree = Tree()

n = len(lst)

MIN = 1
MAX = 100000

for i in range(1, n):
    mytree.update(mytree.root, MIN, MAX, i, i, lst[i])

print(mytree.query(mytree.root, MIN, MAX, 1, 3))

标签:node,right,val,线段,tag,动态,self,left
From: https://www.cnblogs.com/gebeng/p/18102785

相关文章

  • HTML精美登录页面,(动态渐变效果+稍微透明效果)
    最近,学校留的html作业做出来十分简陋学校作业如上图所示,今天我来教大家做一个精美的登录页面。以下是精美的登录页面。HTML精美登录页面接下来我来带大家写代码一,HTML代码<bodyclass="meau"><divclass="formBox"><formaction=""class="FORMF">......
  • Mybatis进阶之动态SQL
    1、MyBatis获取参数值的两种方式MyBatis获取参数值的两种方式:${}和#{}${}的本质就是字符串拼接,#{}的本质就是占位符赋值${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日......
  • 3/28 线段树优化建图
    (1)CF786BLegacy有一张\(n\)个节点和若干条边。边用\(q\)条信息表示:1vuw表示有一条连接\(v\tou\)的有向边,边权为\(w\);2vlrw表示对于所有\(u\in[l,r]\),都有一条连接\(v\tou\)的有向边,边权为\(w\);3vlrw表示对于所有\(u\in[l,r]\),都有......
  • QCustomPlot多段y轴公用x轴、动态增加/移除曲线显示功能
    备注:1、动态增加/移除坐标系;2、多段y轴,共用同一个x轴;3、x轴y轴数据同步,当放大缩小表格时;4、通过定时器0.5s更新一次数据;****亲,感觉不错的话点个赞哦****一、项目中结合树形目录勾选框,进行动态增加和删除勾选框,通过定时器模拟数据进行显示connect(m_treeWidget,&Tr......
  • KingbaseES生成动态SQL
    1.动态SQL动态SQL在程序启动时会根据输入参数替换相应变量。使用动态SQL可以创建更强大和灵活的应用程序,但在编译时SQL语句的全文不确定,因此运行时编译会牺牲一些性能。动态SQL可以是代码或SQL语句的一部分,动态部分要么由开发人员输入,要么由程序本身创建。1.1动态SQL使用场景......
  • 动态判断是否需要Api接口鉴权
    一.概述问题:在使用asp.netcoreapi做业务开发时,在本地vs开发环境,部署后的测试环境,都需要先获取access_token,才能访问api接口,这样浪费了调试与测试时间。    现状:我这里是通过Apollo配置中心定义了二套配置环境,一是Dev环境:用于本地vs开发环境,部......
  • 写模板,线段树
    1意义:线段是是为了对区间中的元素进行操作,而衍生出来的一种数据结构,比如区间加减,区间求和。线段树将1~n的区间分解成4n个小区间。2过程:区间修改就是对一个或者多个节点按照设定的规则对数值进行修改。区间查询就是对一个或多个节点查询的结果按规则进行合并,得到最终结果。其......
  • 【京东云新品发布月刊】2024年3月产品动态
    1.【言犀模型服务】新品上线言犀模型服务平台致力于为开发者提供AI原生应用开发的全链路服务,内置丰富的应用插件,提供便捷的集成方式,结合企业专属数据和API,助力企业高效完成大模型应用构建。2.【数据库管理服务DMS】新品上线数据库管理服务DMS(DatabaseManagementService)是京......
  • 动态内存管理
    目录1.为什么要有动态内存分配2.malloc和free2.1malloc2.2free3.calloc和realloc 3.1calloc3.2realloc 4.常⻅的动态内存的错误4.1对NULL指针的解引⽤操作4.2对动态开辟空间的越界访问4.3对⾮动态开辟内存使⽤free释放4.4使⽤free释放⼀块动态开辟......
  • 动态规划(一)
    文章目录1、建造房屋2、破损的楼梯3、可构造的序列总数4、最快洗车时间5、安全序列6、地图7、电影放映计划1、建造房屋#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;constllp=1e9+7;intn,m,k;lldp[50][5000];//前i个街道花了j元的......