珂朵莉树模板

普通模板:

struct Node
{
    int l,r;
    mutable int v;
    Node(const int &il,const int &ir,const int &iv):l(il),r(ir),v(iv){}
    inline bool operator<(const Node &o)const{return l < o.l;}
};

set<Node> odt;

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,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,int v)
{
    auto itr=split(r+1),itl=split(l);
    odt.erase(itl,itr);
    odt.insert(Node(l,r,v));
}

void performance(int l, int r)
{
    auto itr=split(r + 1),itl = split(l);
    for (;itl!=itr;++itl)
    {
        // Perform Operations here
    }
}

带相邻相同块合并的 assign 操作:

struct Node
{
    int l,r;
    mutable int v;
    Node(const int &il,const int &ir,const int &iv):l(il),r(ir),v(iv){}
    inline bool operator<(const Node &o)const{return l < o.l;}
};

set<Node> odt;

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,v=it->v;
    odt.erase(it);
    odt.insert(Node(l,x-1,v));
    return odt.insert(Node(x,r,v)).first;
}

auto assign(int l,int r,int v)
{
    auto itr=split(r+1),itl=split(l);
    odt.erase(itl,itr);
    return odt.insert(Node(l,r,v)).first;
}

void assall(int l,int r,int v)
{
    auto it=assign(l,r,v);
    int al=l,ar=r;
    if(odt.begin()!=it)
    {
        if((--it)->v==v) al=it->l;
        ++it;
    }
    if(odt.end()!=it&&(++it)->v==v) ar=it->r;
    if(al!=l||ar!=r) assign(al,ar,v);
}
posted @ 2022-04-04 21:09  yhang323  阅读(37)  评论(0)    收藏  举报