首页 > 其他分享 >note ODT

note ODT

时间:2023-10-04 14:22:50浏览次数:29  
标签:iit int ODT pos note split 区间

(珂朵莉图压压惊)


适用场景:不断区间修改、区间询问,数据随机

ODT:old driver tree(老司机树),又名珂朵莉树,是一个骗分的好东西。其内部是基于 std::set 实现的,而 std::set 是基于红黑树实现的,所以我觉得应该是算法,但是对于ODT究竟是算法还是数据结构有争议。

在随机数据下跑得飞快,吊打线段树啥的,时间复杂度为\(O(NloglogN)\)
但是在毒瘤数据下会被卡掉qwq。所以一般用来骗分

其他啥的不讲了,网上一大堆,上正题。

ODT 的主要思想是随机数据很可能使得一大段连续数字相同,因此我们可以把这一整段当成同一个数来处理。

举个栗子(借大佬图一用):

原来需要处理 \(10\) 个数,现在处理 \(4\) 个数即可。(这也是为什么会被卡掉qwq)


讲讲代码实现

为了偷懒方便快捷,可读性增强,我们一般会

#define iit set::iterator

注:iit可改成自己喜欢的,作者不想按shift,故使用iit


初始化,重载运算符。没啥好讲的

struct odt{
	int l,r;
	mutable int v;
	odt(int L=0,int R=-1,int V=0):l(L),r(R),v(V){}
	friend bool operator<(odt a,odt b){
		return a.l<b.l;
	} 
};

敲黑板划重点 ODT重要操作 区间分裂(split)

我们操作的区间并不总是正好覆盖我们存储的区间。因此我们需要一个函数来实现分裂开每个区间的操作,也就是split函数。

split函数接受一个参数 \(pos\),然后把包含 \(pos\) 的区间 \([l,r]\) 分裂成 \([l,pos)\) 和 \([pos,r]\)

\[[l,r]->[l,pos),[pos,r] \]

iit split(int pos){
	iit it=s.lower_bound(pos);
	if(it!=s.end()&&it->l==pos)
		return it;
	--it;
	if(pos>it->r)
		return s.end();
	int l=it->l,r=it->r,v=it->v;
	s.erase(it);
	s.insert(odt(l,pos-1,v));
	return s.insert(odt(pos,r,v)).first;
}

敲黑板划重点 ODT重要操作 区间推平/区间赋值(assign)

如果操作中全是split的话,区间越来越多,那么必然会T飞(再多看一眼就快爆炸),所以这时我们就需要区间赋值操作减少区间数量assign

assign函数要传 \(3\) 个参,分别表示区间左端点( \(l\) ) 、区间右端点( \(r\) )和要赋的值( \(v\) )。赋值时,把左右端点split一下,然后将中间的部分变成一个新的区间即可。

void assign(int l,int r,int v){
	iit rr=split(r+1);
	iit ll=split(l);
	s.erase(ll,rr);
	s.insert(odt(l,r,v));
}

其他没啥好讲的了(真没啥能讲的了,一个比一个暴力,没脸讲

那就再粘个区间加的代码吧(其他都是依葫芦画瓢了)

全取出来加一遍,完事(就这么简单粗暴)。

void add(int l,int r,int v){
    iit ll=split(l);
	iit rr=split(r+1);
    for(iit it=ll;it!=rr;it++)
		(it->v)+=v;
}

留道最简单的板子题吧

code


行了我知道你在找什么

标签:iit,int,ODT,pos,note,split,区间
From: https://www.cnblogs.com/xiaoluotongxue2012/p/17742224.html

相关文章

  • 第02章 Python语法基础,IPython和Jupyter Notebooks
    第2章Python语法基础,IPython和JupyterNotebooks当我在2011年和2012年写作本书的第一版时,可用的学习Python数据分析的资源很少。这部分上是一个鸡和蛋的问题:我们现在使用的库,比如pandas、scikit-learn和statsmodels,那时相对来说并不成熟。2017年,数据科学、数据分析和机器学习的......
  • 什么是企业级管理软件的 Release Notes
    企业级软件的ReleaseNote详解在现代商业环境中,企业级软件已经成为了组织中不可或缺的一部分。这些软件系统通常被用来管理各种业务流程,从客户关系管理到供应链管理,再到财务和人力资源管理。随着软件的不断发展和更新,确保企业级软件的正常运行变得至关重要。为了帮助用户了解每......
  • 2023年10月,红米(小米)note 8 pro 优化记
    看了红米的note13pro和note12turbo的参数和价格后,我决定下单买个note8pro的手机壳,确实有新手机的感觉了。我note8pro手机参数如下MIUI12.0.5内存是6G具体看下图经过优化调整后一般还剩3G内存,文件夹存了很多图标后也不再卡了优化步骤下载adbhttps://dl.google.co......
  • 如何管理 Jupyter Notebook 的kernel环境
    在JupyterNotebook中,你可以使用以下方法来管理kernel环境:1.安装kernel:首先,你需要安装所需的kernel。不同的编程语言和环境可能有不同的kernel。你可以使用包管理器(如pip、conda)来安装特定语言的kernel。例如,要安装Pythonkernel,你可以运行 pipinstallipykernel 命......
  • Notepad++ 下载与安装教程
    Notepad++下载与安装教程 Notepad++简介Notepad++是程序员必备的文本编辑器,Notepad++中文版小巧高效,支持27种编程语言,通吃C,C++,Java,C#,XML,HTML,PHP,JS等,Notepad++中文版编辑器可完美地取代微软的记事本。一,Notepad++下载1.因为最近官网进不去,所有进人这个网站进......
  • 从Redmi Note 13系列发布看当前UP主身份立场
    RedmiNote 13系列发布了,不出意外,出现了很多UP主在吹捧这款手机,外观在线,有性价比,性能够用。这些UP基本都可以确定,和小米存在某种关系,要么是合作关系,要么是自来水。RedmiNote13系列,有人说缺点,就一大堆人在下面攻击UP。你说是偶然吗?我不相信。RedmiNote 13 我没用过,但是根......
  • 微信防撤回note
    附加调试,先提前把TLS的断点删掉免得混淆找到符号--->WeChatWin.dll,在搜索--->当前区域--->字符串右键全部断点,再删掉未撤回就断掉的 之后发消息再撤回【这里一定要对方发消息撤回!!!!】定位到真正的revoke模块,并用;打好注释,共计8次断下删掉全部断点,打开注释模块(创口贴旁边那个小......
  • Jupyter Notebook配置远程服务器
    一、在远程服务器上安装JupyterNotebook首先在服务器端安装Jupyter Notebook并通过配置文件进行相应参数的设置,然后使用本地主机的浏览器远程访问。1.连接远程服务器Win+R输入cmd回车进入命令行 连接远程服务器命令:sshuser名@服务器ip输入密......
  • notepad安装json格式化工具
    Notepad++是Windows下一款非常好用的免费多语言代码编辑器,可以通过添加JSON格式化插件,更方便的协助我们将JSON数据格式化为观看更直观友好的格式插件名称:JSONViewer1.在线安装1.1打开Notepad++,选择插件>插件管理>可用>搜索关键词json即可找到JSONViewer1.2......
  • 在jupyter notebook实现代码自动提示
    为什么代码自动提示很重要?在使用JupyterNotebook编写代码时,代码自动提示是一项非常有用的功能。它可以帮助你快速找到函数、方法和变量的名称,提高了代码的编写效率,同时减少了潜在的拼写和语法错误。效果如下:本篇博客将介绍如何在JupyterNotebook中启用和使用代码自动提示功能......