Description
给出数据流SummaryRanges
类以提供三种操作:
SummaryRanges()
:初始化流void addNum(int value)
:添加value
到流中int[][] getIntervals()
:查询返回若干不相交的区间 (按照 排序)
Constraints
- 最多
次addNum(int value)
和getIntervals()
操作 - 最多
次getIntervals()
操作
Solution
使用并查集
Code
class SummaryRanges {
public:
array<int, 10004> p;
set<int> inserted;
SummaryRanges() {
ranges::fill(p, -1);
}
int find(int u) {
return p[u] == u ? u : find(p[u]);
}
void addNum(int value) {
if(~p[value]) return;
p[value] = value;
inserted.emplace(value);
auto l = value - 1;
auto r = value + 1;
auto merge = [&](int u, int v) {
auto pu = find(u), pv = find(v);
p[pu] = pv;
};
if(l >= 0 && p[l] != -1) merge(l, value);
if(r <= 10000 && p[r] != -1) merge(value, r);
}
vector<vector<int>> getIntervals() {
vector<vector<int>> ans;
auto iter = inserted.begin();
while(iter != inserted.end()) {
auto l = *iter;
auto r = find(l);
ans.push_back({l, r});
iter = inserted.lower_bound(r + 1);
}
return ans;
}
};