首页 > 其他分享 >珂朵莉树(ODT)

珂朵莉树(ODT)

时间:2024-10-06 11:49:00浏览次数:1  
标签:node insert ODT odt long 朵莉树 intt first

前言

主要是一种暴力思想。。。

本文来自 wiki 与洛谷题解的整合。

应用

主要是应付随机数据(区间操作)

实现

有几个核心操作。

set实现方法

定义

struct node
{
	intt l,r;//intt:long long
	mutable intt v;
	node(const intt &ll,const intt &rr,const intt &vv) : l(ll),r(rr),v(vv) {}
	bool operator <(const node &o)const 
	{
		return l<o.l;
	}
};
set<node>odt;

split 操作(分裂)

auto split(int x)
{
	auto it=odt.lower_bound(node(x,0,0));
	if(it!=odt.end()&&it->l==x)return it;
	it--;
	intt l=it->l,r=it->r,v=it->v;
	odt.insert(node(l,x-1,v));
	return odt.insert(node(x,r,v)).first;
}
  1. 如果分裂的点恰好是某个区间的左端点,就不用分裂,保留即可。
  2. 如果分裂的点在一个区间的中间节点,就将其分为 \([l,x-1]\) 和 \([x,r]\) 这两个区间
  3. 注意:odt.insert(node(x,r,v)).first这表示新加入的node的位置的迭代器(这是因为insert返回了一个pairfirst就只新加入的node的位置的迭代器了)

assign 操作(区间推平)

void assign(intt l,intt r,intt v)//intt:long long
{
	auto itr=split(r+1),itl=split(l);
	odt.erase(itl,itr);
	odt.insert(node(l,r,v));
}

将边角余料分裂出来,再将中间所有元素删除,最后加入推平区间。

如下图:

img

set的一个用法:erase(first,last)删除迭代器在 \([first,last)\) 范围内所有元素。

标签:node,insert,ODT,odt,long,朵莉树,intt,first
From: https://www.cnblogs.com/tyccyt/p/18448960

相关文章

  • 珂朵莉树
    吾日三省吾身:末日时在干什么?有没有空?可以来拯救一下吗?算法思想非常简单:就是暴力。对于数据结构题,我们有这样一种思路去维护:对于一个数列,我们把不同的数字看成不同的颜色段,然后对每个颜色段进行暴力操作,可以有效降低时间复杂度。但这种暴力是很好卡掉的,只需让颜色段尽可能多,算法......
  • 珂朵莉树
    经典题(珂朵莉树的诞生):https://www.luogu.com.cn/problem/CF896C参考:https://www.luogu.com.cn/article/yfcae6d6不用知道它的具体复杂度,主要是学习如何实现。珂朵莉树(ChthollyTree),又名老司机树ODT(OldDriverTree)。splitpos区间分割操作,也就是将包含pos的区间分割为两端......
  • 题解:P11007 『STA - R7』Odtlcsu
    评价:简单构造。思路注意题目中的“如果有多解输出任意一种即可”。由于\(a\)与\(a^{2}\)的奇偶性必定是一致的,所以我们可以将情况分为两种。当\(x\)与\(y\)奇偶性不一致时,但由于\(a\)与\(a^{2}\)的奇偶性必定是一致的,所以始终无法构造出正确的序列。但注意题目......
  • 珂朵莉树/颜色段均摊学习笔记
    珂朵莉树是基于set的数据结构,与线段树、平衡树等树形结构类似,珂朵莉树是用来解决区间问题的很暴力的树形结构该数据结构支持区间推平,即将区间\([l,r]\)赋值为同一个值1.前置知识setset本质是平衡树,所以不会出现重复的元素且会自动排序,部分函数:set<Node>t;//定......
  • 【学习笔记】珂朵莉树
    前言珂朵莉树(ChthollyTree),又名老司机树(OldDriverTree),起源自CF896CWillem,ChthollyandSeniorious。严格来说,珂朵莉树这种想法是基于数据随机的颜色段均摊,而不是一种数据结构,可作为一些题目的暴力做法(因此原题被分到了暴力数据结构的标签),在随机数据下一般效率较高。基......
  • [CF1172E] Nauuo and ODT
    [CF1172E]NauuoandODT首先考虑单次询问,将每个颜色拉出来,求解有多少条路径至少包含一个给定点。这就是维护所有黑色连通块的大小平方和。我们每一次删掉一个点就等价于将所有和他相连的点删掉,这样一定会T。可以使用类似CF487ETourists的套路,将其父亲—儿子化,如果一个点......
  • 洛谷 CF896C Willem, Chtholly and Seniorious之珂朵莉树板子
    洛谷CF896C题解传送锚点摸鱼环节Willem,ChthollyandSeniorious题面翻译【题面】请你写一种奇怪的数据结构,支持:\(1\)\(l\)\(r\)\(x\):将\([l,r]\)区间所有数加上\(x\)\(2\)\(l\)\(r\)\(x\):将\([l,r]\)区间所有数改成\(x\)\(3\)\(l\)\(r\)\(x\):输出将\(......
  • 【模板】珂朵莉树
    这是即将推送到OI-wiki的,对于原OI-wiki珂朵莉树页面的重构。作者是我。感谢上一位维护这玩意的人。简介珂朵莉树(ChthollyTree),又名老司机树ODT(OldDriverTree)。起源自CF896C。这个名称指代的是一种“使用平衡树(std::set、std::map等)或链表(std::list、手写链表等)维护颜......
  • [OI] 珂朵莉树
    对于一个序列,它有较多重复元素,并且题目需要维护区间修改,维护区间信息,维护整块值域信息的,那么就可以考虑珂朵莉树解决.主要思想珂朵莉树将全部相同的颜色块压缩为一组,如对于下述序列:111234444珂朵莉树铺平后即可以变为这样:{1,3,1}{4,4,2}{5,5,3}{6,9,4}其中的三......
  • [数据结构] 珂朵莉树
    介绍珂朵莉树,学名珂朵莉树,又学名老司机树($ODT$),常用来解决“区间推平”(把区间改为某一个数)等的操作,只适用于随机数据,可以定向卡掉;其实这玩意就是暴力,没啥可说的,分块都比不上她暴力;但人家毕竟是她,所以对于一些题还是有用的;实现只要你会$C++\STL$里的$set$,搞定她完......