离散化解矩形覆盖

神马是离散化:http://www.matrix67.com/blog/archives/108

例题:POJ 1151 Atlantis

#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
#include <iomanip>
 
using namespace std;
 
struct rect
{
    double x1;
    double x2;
    double y1;
    double y2;
};
 
int main(int argc, char **argv)
{
    int t = 1;
    int n;
 
    while (cin >> n && n)
    {
        vector<double> vecX, vecY;
        vector<rect> vecRec;
        set<pair<double, double> > setCover;
 
        // Insert x, y to vecX, vecY.
        while (n--)
        {
            rect r;
 
            cin >> r.x1 >> r.y1 >> r.x2 >> r.y2;
 
            vecX.push_back(r.x1);
            vecX.push_back(r.x2);
            vecY.push_back(r.y1);
            vecY.push_back(r.y2);
            vecRec.push_back(r);
        }
 
        // Sort
        sort(vecX.begin(), vecX.end());
        sort(vecY.begin(), vecY.end());
 
        // Mark cover
        for (vector<rect>::const_iterator it = vecRec.begin();
            it != vecRec.end();
            ++it)
        {
            vector<double>::iterator x1 = lower_bound(vecX.begin(), vecX.end(), it->x1);
            vector<double>::iterator x2 = lower_bound(vecX.begin(), vecX.end(), it->x2);
            vector<double>::iterator y1 = lower_bound(vecY.begin(), vecY.end(), it->y1);
            vector<double>::iterator y2 = lower_bound(vecY.begin(), vecY.end(), it->y2);
 
            for (vector<double>::iterator x = x1; x != x2; ++x)
            {
                for (vector<double>::iterator y = y1; y != y2; ++y)
                {
                    setCover.insert(make_pair(*x, *y));
                }
            }
        }
 
        double sum = 0.0;
 
        // Calculate result
        for (vector<double>::const_iterator x = vecX.begin(); x != vecX.end() - 1; ++x)
        {
            for (vector<double>::const_iterator y = vecY.begin(); y != vecY.end() - 1; ++y)
            {
                if (setCover.find(make_pair(*x, *y)) != setCover.end())
                {
                    sum += (*(x + 1) - *x) * (*(y + 1) - *y);
                }
            }
        }
 
        // Make sure output format is correct.
        cout << "Test case #" << t++ << endl;
        cout << "Total explored area: " << setprecision(2) << fixed << sum << endl;
        cout << endl;
    }
 
    return 0;
}
posted @ 2012-09-23 12:43  紫红的泪  阅读(561)  评论(0编辑  收藏  举报