首页 > 其他分享 >珂朵莉树

珂朵莉树

时间:2023-05-23 14:34:29浏览次数:36  
标签:itl int auto LL 朵莉树 split itr

区间赋值的数据结构都可以骗分,在数据随机的情况下,复杂度可以保证。
时间复杂度:O(nloglogn)

struct ODT{
	struct node{
		int l, r;
		mutable LL v;
		node(int l, int r = -1, LL v = 0) : l(l), r(r), v(v) {}
		bool operator < (const node &o) const {return l < o.l;}
	};
	set<node> s;
	ODT() {s.clear();}
	auto split(int pos){
		auto it = s.lower_bound(node(pos));
		if (it != s.end() && it -> l == pos) return it;
		it -- ;
		int l = it -> l, r = it -> r;
		LL v = it -> v;
		s.erase(it);
		s.insert(node(l, pos - 1, v));
		return s.insert(node(pos, r, v)).first;
	}
	void assign(int l, int r, LL x){
		auto itr = split(r + 1), itl = split(l);
		s.erase(itl, itr);
		s.insert(node(l, r, x));
	}
	void add(int l, int r, LL x){
		auto itr = split(r + 1), itl = split(l);
		for (auto it = itl; it != itr; it ++ ){
			it -> v += x;
		}
	}
	LL kth(int l, int r, int k){
		vector<pair<LL, int>> a;
		auto itr = split(r + 1), itl = split(l);
		for (auto it = itl; it != itr; it ++ ){
			a.push_back(pair<LL, int>(it -> v, it -> r - it -> l + 1));
		}
		sort(a.begin(), a.end());
		for (auto [val, len] : a){
			k -= len;
			if (k <= 0) return val;
		}
	}
	LL quickpow(LL a, int b, int mod){
		a %= mod;
		LL ans = 1;
		while (b){
			if (b & 1){
				ans = ans * a % mod;
			}
			b >>= 1;
			a = a * a % mod;
		}
		return ans;
	}
	LL powersum(int l, int r, int x, int mod){
		auto itr = split(r + 1), itl = split(l);
		LL ans = 0;
		for (auto it = itl; it != itr; it ++ ){
			ans = (ans + quickpow(it -> v, x, mod) * (it -> r - it -> l + 1) % mod) % mod;
		}
		return ans;
	}
};

标签:itl,int,auto,LL,朵莉树,split,itr
From: https://www.cnblogs.com/Hamine/p/17421745.html

相关文章

  • 【模板】ODT | Old Driver Tree | 珂朵莉树
    postedon2021-04-0220:38:49|under学术|source这个东西本身不常用,但是这个维护连续段的写法很常用。标签:暴力、数据结构、std::set#include<set>template<cla......
  • 珂朵莉树学习笔记
    ##什么是珂朵莉树?**珂朵莉树**,别名颜色段均摊、ODT,它是$2017$年一场CF比赛中提出的数据结构,因为题目背景主角是《末日时在做什么?有没有空?可以来拯救吗?》的主角珂朵莉,......
  • 珂朵莉树浅析
    珂朵莉树浅析0.关于珂朵莉中国珂学院1.珂朵莉树实现珂朵莉树(也称OldDriverTree),是一种暴力数据结构,其代表的操作有:区间推平(将区间\([l,r]\)的数修改为\(x\));......
  • 珂朵莉树
    严格来说,珂朵莉树主要的用处是骗分——OIWikiclassODT{structnode{intl,r;mutablellv;node(constint&il,constint&ir,......
  • 浅谈珂朵莉树
    珂朵莉最可爱了。好了不废话了,直接开始珂朵莉树。什么是珂朵莉树珂朵莉树,又叫老司机树,英文名字\(\text{ODT}\),是一种支持区间平推的乱搞数据结构,在数据随机时表现十分......
  • CDQ && 珂朵莉树
    对于题目:P4690[Ynoi2016]镜中的昆虫我们零基础从各个小部分开始学习,并且A了Ta.Part1CDQ分治一看到这个东西,一定会觉得很吓人,觉得是什么高大上的东西。其实不......
  • 珂朵莉树学习笔记
    0x00前言0x01关于其命名  最开始出现在CodeforcesRound#449(Div.1)C题上,这位珂学家在题解中用了一种玄学的数据结构解题,开始命名为ODT树(OldDriverTree,老......
  • 颜色段均摊,珂朵莉树
    珂朵莉树,又名ODT。暴力数据结构。前置芝士会用STL的set就行。原理珂朵莉树把一个区间看做一个节点扔到set里来保证随机情况下的复杂度。所以这玩意其实叫颜色段均摊。......
  • 珂朵莉树合集
    ColortheBall#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;//conllexprintmod=998244353;//conllexprintmod=1000000007;templ......