1151:Atlantis
keyword
平面走査法 平面幾何 C++
概要
長方形が複数与えられるのでカバーする面積を求める問題。
Problem 1202 : Mobile Phone Coverageの類題。
int main(){ int i, j, n, cnt=0; double x1, y1, x2, y2; while(scanf("%d",&n), n){ if(cnt++) putchar('\n'); set<double> eventline; vector<double> x1s, y1s, x2s, y2s; x1s.reserve(n+1); y1s.reserve(n+1); x2s.reserve(n+1); y2s.reserve(n+1); REP(i,n){ scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2); eventline.insert(x1); eventline.insert(x2); x1s.PB(x1); y1s.PB(y1); x2s.PB(x2); y2s.PB(y2); } double ans = 0.0, len = 0.0; EACH(eventline,it){ vector< pair<double,double> > ranges; ranges.reserve(n+1); double lb = -(1<<20); REP(i,n){ if(x1s[i] <= *it && *it < x2s[i]) ranges.PB(MP(y1s[i], y2s[i])); } len = 0; sort(ALL(ranges)); REP(i,SZ(ranges)){ len += max(0.0,ranges[i].second-max(lb,ranges[i].first)); lb = max(lb, ranges[i].second); } if(len > EPS){ ITER(eventline) itt = it; advance(itt,1); ans += len * ((*itt) - (*it)); } } printf("Test case #%d\n", cnt); printf("Total explored area: %.2f\n", ans); } return 0; }