珂朵莉树模板
普通模板:
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);
}

浙公网安备 33010602011771号