问题描述
给你区间的 空 集,请你设计并实现满足要求的数据结构:
新增:添加一个区间到这个区间集合中。
统计:计算出现在 至少一个 区间中的整数个数。
实现 CountIntervals 类:
CountIntervals() 使用区间的空集初始化对象
void add(int left, int right) 添加区间 [left, right] 到区间集合之中。
int count() 返回出现在 至少一个 区间中的整数个数。
注意:区间 [left, right] 表示满足 left <= x <= right 的所有整数 x 。
题解
/*只要和当前区间有交集的元素都会被不断被移除*/ //1.开始:找第一个大于当前区间左端点的区间 //2.终结:遍历到的左区间大于当前的右区间(即不重合)
代码
class CountIntervals {
public:
map<int,int> s; //反向存储,才能对区间右断点进行判断(不会存在右断点相同的情况<肯定会合并!!!>)
uint64_t cnt;
CountIntervals() {
cnt=0;
}
void add(int left, int right) {
int addright=right,addleft=left;
auto p = s.lower_bound(left);
while(p!=s.end()&&p->second<=right){
addright = max(addright, p->first); addleft = min(addleft, p->second);
cnt -= p->first - p->second+1; //旧区间的cnt
p = s.erase(p);
}
cnt += addright - addleft+1; //新区间引入的cnt
s[addright]=addleft;
}
int count() {
return cnt;
}
};