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

珂朵莉树

时间:2022-11-26 19:01:09浏览次数:60  
标签:node itl int odt 朵莉树 split itr

严格来说,珂朵莉树主要的用处是骗分 ——OI Wiki

class ODT {
    struct node {
        int l, r;
        mutable ll v;
        node(const int& il, const int& ir, const ll& iv) : l(il), r(ir), v(iv) {}
        inline bool operator<(const node& o) const { return l < o.l; }
    };
    set<node> odt;

public:
    // void init() {
        // cin >> n;
        // for (int i = 1; i <= n; ++i) {
            // int x;
            // cin >> x, odt.insert(node(i, i, x));
        // }
    // }

    auto split(int x) {
        if (x > n) return odt.end();
        auto it = --odt.upper_bound(node(x, 0, 0));
        if (it->l == x) return it;
        int l = it->l, r = it->r;
        ll v = it->v;
        odt.erase(it);
        odt.insert(node(l, x - 1, v));
        return odt.insert(node(x, r, v)).first;
    }

    void assign(int l, int r, ll v) {
        auto itr = split(r + 1), itl = split(l);
        odt.erase(itl, itr);
        odt.insert(node(l, r, v));
    }
    
    void add(int l, int r, ll v) {
        auto itr = split(r + 1), itl = split(l);
        for (; itl != itr; ++itl) itl->v += v;
    }
    
    ll kth_element(int l, int r, int k) {
        auto itr = split(r + 1), itl = split(l);
        vector<pair<ll, int>> V;
        for (; itl != itr; ++itl) V.push_back(make_pair(itl->v, itl->r - itl->l + 1));
        sort(V.begin(), V.end());
        for (auto x : V) {
            k -= x.second;
            if (k <= 0) return x.first;
        }
        return -1;
    }

    void query(int l, int r) {
        auto itr = split(r + 1), itl = split(l);
        ll ans = 0;
        for (; itl != itr; ++itl) {
            // itl->r - itl->l + 1    itl->v
            // sum += (itl->r - itl->l + 1) * itl->v;
        }
    }
};

例题

CF-896C

code

标签:node,itl,int,odt,朵莉树,split,itr
From: https://www.cnblogs.com/ckb2008/p/odt-template.html

相关文章

  • 浅谈珂朵莉树
    珂朵莉最可爱了。好了不废话了,直接开始珂朵莉树。什么是珂朵莉树珂朵莉树,又叫老司机树,英文名字\(\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......