首页 > 其他分享 >ODT

ODT

时间:2024-03-30 10:45:17浏览次数:22  
标签:right val ODT self tree def left

暴力美学,珂朵莉树!

from sortedcontainers import SortedList
class node:
    __slots__ = ['l', 'r', 'val']

    def __init__(self, l, r, val):
        self.l = l
        self.r = r
        self.val = val

    def __lt__(self, other):
        return self.l < other.l

    def unpack(self):
        return self.l,self.r,self.val

class Tree:
    def __init__(self,l,r,val):
        self.tree = SortedList([node(l,r,val)])

    def printf(self):
        for x in self.tree:
            l,r,val = x.unpack()
            print(f"[{l},{r},{val}]",end=' ')
        print()

    def split(self,pos):
        idx = self.tree.bisect_left(node(pos,0,0))
        if idx != len(self.tree) and self.tree[idx].l == pos:
            return idx
        idx -= 1
        l,r,val = self.tree[idx].unpack()
        self.tree[idx].r = pos - 1
        self.tree.add(node(pos,r,val))
        return idx + 1

    def get_split(self,l,r):
        return self.split(l),self.split(r + 1)

    # 将[l,r]区间赋值为val,所以要将与[l,r]区间有交集的区间给分隔开来
    def assign(self,l,r,val):
        left,right = self.get_split(l,r)
        del self.tree[left:right]
        self.tree.add(node(l,r,val))

    def update(self,l,r,val):
        left,right = self.get_split(l,r)
        for i in range(left,right):
            self.tree[i].val += val

    def query_min(self,l,r):
        left,right = self.get_split(l,r)
        return min(x.val for x in self.tree[left:right])

    def query_max(self,l,r):
        left,right = self.get_split(l,r)
        return max(x.val for x in self.tree[left:right])

    def query_kth(self,l,r,k):
        left,right = self.get_split(l,r)
        lst = [(x.val,x.r - x.l + 1) for x in self.tree[left:right]]
        for val,length in sorted(lst):
            k -= length
            if k <= 0:
                return val




mytree = Tree(1,10000,0)

mytree.update(1,100,1)

mytree.printf()

# [1,100,1] [101,10000,0] 

标签:right,val,ODT,self,tree,def,left
From: https://www.cnblogs.com/gebeng/p/18105192

相关文章

  • 珂朵莉树ODT 模板
    构造set:structnode{intl,r;mutableintv;node(intl,intr,intv=0):l(l),r(r),v(v){}booloperator<(constnode&a)const{returnl<a.l;}};set<node>s;分裂set:autosplit(intpos){aut......
  • UVM宏解释+odt文件转doc+merge命令和difflib+python调用命令+clog2和系统函数+java添
    UVM宏解释UVM_DISABLE_AUTO_ITEM_RECORDINGhttps://blog.csdn.net/MGoop/article/details/127295965itemrecord的方法主要是用于记录事务信息的,原理是调用accept_tr,begin_tr,end_tr。似乎和波形上显示出各个事务相关。默认情况下,在调用get_next_item()和item_done()时自动......
  • P5314 [Ynoi2011] ODT
    好题,牛牛的一个套路。先树剖一下,我们可以很简单的用树状数组维护每个点的真实值。对于每个点只维护所有轻儿子的信息,对于每次询问的时候暴力加入当前点,重儿子以及父亲的信息,查询第\(k\)大,再删除信息即可。考虑链修改的影响。因为只维护的是轻儿子的信息,那么只有链上的所有轻......
  • note ODT
    (珂朵莉图压压惊)适用场景:不断区间修改、区间询问,数据随机ODT:olddrivertree(老司机树),又名珂朵莉树,是一个骗分的好东西。其内部是基于std::set实现的,而std::set是基于红黑树实现的,所以我觉得应该是算法,但是对于ODT究竟是算法还是数据结构有争议。在随机数据下跑得飞快,吊打......
  • MethodTimer.Fody 统计代码执行时间
    开发时,经常需要了解代码的执行效率,可以借助MethodTimer.Fody这个开源库。主页:https://github.com/Fody/MethodTimer1、安装Nuget包:Install-PackageMethodTimer.Fody2、AddtoFodyWeavers.xml<Weavers><MethodTimer/></Weavers>3、代码部分,在需要统计的方法上头加上......
  • 珂朵莉树(ODT)
    处理区间赋值问题的神器!珂朵莉树的实现非常简单(baoli),建树时把区间的左右端点和权值作为一个节点全扔到std::set(或者链表)中维护即可split:核心操作之一,将一段区间提取出来,在此之上进行一些操作assign:核心操作之二,也是降低珂朵莉树时间复杂度的重要操作,把一段区间推平赋值,......
  • ODT
    别写。Useless.TrysomeODT.CF915E\(\color{#52C41A}{\text{Accepted}}\)CF896C\(\color{#52C41A}{\text{Accepted}}\)P3740\(\color{#52C41A}{\text{Accepted}}\)......
  • 【模板】ODT | Old Driver Tree | 珂朵莉树
    postedon2021-04-0220:38:49|under学术|source这个东西本身不常用,但是这个维护连续段的写法很常用。标签:暴力、数据结构、std::set#include<set>template<cla......
  • DDR3原理(ODT)
    一、存储器的分类存储器一般来说可以分为内部存储器(内存),外部存储器(外存),缓冲存储器(缓存)以及闪存这几个大类。内存也称为主存储器,位于系统主机板上,可以同CPU直接......
  • Microsoft 365 开发:如何通过脚本批量获取用户MFA状态以及Default MethodType
    Blog链接:​​​https://blog.51cto.com/13969817​​今天给大家分享一下如何通过脚本检验用户是否启用了MFA以及DefaultMethodType,首先我们确保环境:·      部署了MS......