注意事项:
区间都是左闭又开[x,y)
from sortedcontainers import SortedList
class RangeModule:
def __init__(self):
self.rl=SortedList()
self.count=0
def addRange(self, left: int, right: int) -> None: #[left,right)
right-=1
n,i=len(self.rl),self.rl.bisect_left((left-1,-1))
cur_l,cur_r=left,right
while i<n:
r,l=self.rl[i]
if l>right+1:break
cur_l,cur_r=min(cur_l,l),max(cur_r,r)
self.count-=r-l+1
self.rl.pop(i)
n-=1
self.rl.add((cur_r,cur_l))
self.count+=cur_r-cur_l+1
def getCount(self,left: int, right: int): #[left,right)
right-=1
i,cnt,n=self.rl.bisect_left((left,-1)),0,len(self.rl)
while i<n:
r,l=self.rl[i]
if l>right :break
cnt+=min(r,right)-max(l,left)+1
i+=1
return cnt
def getAllCount(self):return self.count
def queryRange(self, left: int, right: int) -> bool: #[left,right)
return self.getCount(left,right)==right-left
def removeRange(self, left: int, right: int) -> None: #[left,right)
need_delete,need_add=[],[]
right-=1
i,n=self.rl.bisect_left((left,-1)),len(self.rl)
while i<n:
r,l=self.rl[i]
if l>right :break
com_l,com_r=max(l,left),min(r,right)
need_delete.append((r,l))
if com_l!=left :
need_add.append((r,com_r+1))
elif com_r!=right:
need_add.append((com_l-1,l))
left=com_r+1
else:
if l<=left-1:need_add.append((left-1,l))
if right+1<=r:need_add.append((r,right+1))
break
i+=1
for item in need_delete:
self.rl.discard(item)
self.count-=item[0]-item[1]+1
for item in need_add:
self.rl.add(item)
self.count+=item[0]-item[1]+1