区间覆盖
编程之美2.19节,写了一份实现。
对于扩展问题,可以使用一个平面四叉树来维护被覆盖的部分,对于每一个查询的矩形,在树中查询是否有空隙。这个过程同建树的过程中,插入一个新矩形是一致的。在建四叉树的时候,注意合并那些完全覆盖的子树成为叶节点。当然,我觉得用k-d树来维护覆盖信息也可以。
template<class T>
struct Interval {
T a, b;
bool operator<(const Interval& other) const {
return a < other.a || a == other.a && b > other.b;
}
};
int main() {
int n, m;
while (cin>>n>>m) {
if (!n) break;
typedef vector< Interval<int> > IntVec;
IntVec intervals;
while (n--) {
Interval<int> interval;
cin>>interval.a>>interval.b;
intervals.push_back(interval);
}
// merge intervals
sort(intervals.begin(), intervals.end());
IntVec::iterator ite = intervals.begin();
for (IntVec::iterator it = intervals.begin(); it != intervals.end(); ++it)
if (it->a <= ite->b) ite->b = max(it->b, ite->b);
else *++ite = *it;
intervals.erase(++ite, intervals.end());
for (int i = 1; i <= m; ++i) {
Interval<int> interval;
cin>>interval.a>>interval.b;
IntVec::iterator it = upper_bound(intervals.begin(), intervals.end(), interval);
bool cover = (it != intervals.begin() && (--it)->b >= interval.b);
cout<<"Case #"<<i<<": "<<(cover? "Covered": "Not covered")<<".\n";
}
}
return 0;
}