ODT模板

 struct node{
   int l,r;
   mutable int v;
   node(int L,int R,int V):l(L),r(R),v(V){}
   inline bool operator < (const node& b)const{
       return l<b.l;
   }
};
set<node>s;
typedef set<node>::iterator IT;
int ans;
inline IT split(int pos){
   IT it = s.lower_bound(node(pos,pos,0));
   if(it!=s.end() && it->l==pos)return it;
   --it;
   int l=it->l,r=it->r,v=it->v;
   s.erase(it);
   s.insert(node(l,pos-1,v));
   return s.insert(node(pos,r,v)).first;
}
inline void assigns(int l,int r,int v){
    ///注意分裂应该是从右边先开始分裂,
    ///因为如果先从左边分裂,那么在L和R相同的时候,把R+1的区间给分裂掉,造成找不到R导致RE
    ///但是先分裂右边,那么it2不会把it1分裂掉
    IT it2=split(r+1),it1=split(l);
    IT it=it1;
    for (;it!=it2;++it){
        ans-=it->v*(it->r - it->l+1);
    }
    s.erase(it1,it2);
    ans+=(r-l+1)*v;
    s.insert(node(l,r,v));
}

 

posted @ 2019-09-10 00:49  bluefly-hrbust  阅读(154)  评论(0编辑  收藏  举报