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)); }
有不懂欢迎咨询
QQ:1326487164(添加时记得备注)