珂朵莉树(ODT)

珂朵莉树学习笔记

oi-wiki

珂朵莉树是一种应对区间赋值题的骗分算法(尽管在某些题上复杂度是对的)

随机数据下表现良好。

模板

struct node {
	int l, r;
	mutable ll v;
	node(){}
	node(int jzp, int zzz, ll lsr) { l = jzp, r = zzz, v = lsr; }
	inline bool operator <(const node &a) const {
		return l < a.l;
	}
};
set<node> st;
typedef set<node>::iterator iter;
inline iter Split(int x) {//[l,x),[x,r]
	if (x > n)	return st.end();
	iter it = --st.upper_bound(node(x, 0, 0));
	if (x == it->l)	return it;
	int l = it->l, r = it->r;
	ll v = it->v;
	st.erase(it);
	st.insert(node(l, x - 1, v));
	return (st.insert(node(x, r, v))).first;
}
inline void Assign(int l, int r, int v) {//区间赋值
	iter itr = Split(r + 1), itl = Split(l);
	st.erase(itl, itr);
	st.insert(node(l, r, v));
}

其余操作就直接 Split 出来暴力扫(这也是复杂度错误的根源)

相关题目

Willem, Chtholly and Seniorious

由于数据完全随机,怎么暴力怎么来就好。

矿洞:坍塌Intervals of IntervalsLittle Pony and Lord Tirek

这三道题由于所有的操作完后都会 Assign,势能分析可以证明复杂度。

posted @ 2021-01-14 17:39  JiaZP  阅读(128)  评论(0编辑  收藏  举报