画圆的沙滩

亦简亦美

区间覆盖

编程之美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;
}

posted on 2011-03-23 15:44  acmaru  阅读(195)  评论(0编辑  收藏  举报

导航