珂朵莉树(ODT)
珂朵莉树学习笔记
珂朵莉树是一种应对区间赋值题的骗分算法(尽管在某些题上复杂度是对的)
随机数据下表现良好。
模板
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 Intervals ;Little Pony and Lord Tirek
这三道题由于所有的操作完后都会 Assign
,势能分析可以证明复杂度。