zoukankan      html  css  js  c++  java
  • HDU1542 Atlantis 求矩形面积并

    http://acm.hdu.edu.cn/showproblem.php?pid=1542

    该题就是给定N个矩形,求出叠加之后的面积,与求面积交类似,就是覆盖次数没有了要求。

    代码如下:

    #include <cstdlib>
    #include <cstring>
    #include <cstdio>
    #include <cmath>
    #include <map>
    #include <algorithm>
    #define MAXN 205
    using namespace std;

    struct Node
    {
    double x, y1, y2;
    int lr;
    bool operator < (Node t) const
    {
    return t.x-x>1e-6;
    }
    }e[MAXN*2];

    struct
    {
    int l, r;
    int cover;
    }seg[MAXN*3];

    double yy[MAXN*2];

    void creat(int f, int l, int r)
    {
    int mid = (l+r)>>1;
    seg[f].l = l, seg[f].r = r;
    seg[f].cover = 0;
    if (r - l > 1)
    {
    creat(f<<1, l, mid);
    creat(f<<1|1, mid, r);
    }
    }

    void modify(int f, int l, int r, int val)
    {
    int mid = (seg[f].l + seg[f].r) >> 1;
    if (seg[f].l == l && seg[f].r == r)
    {
    seg[f].cover += val;
    }
    else if (seg[f].r - seg[f].l > 1)
    {
    if (r <= mid)
    modify(f<<1, l, r, val);
    else if (l >= mid)
    modify(f<<1|1, l, r, val);
    else
    {
    modify(f<<1, l, mid, val);
    modify(f<<1|1, mid, r, val);
    }
    }
    }

    void query(int f, double &ans)
    {
    if (seg[f].cover > 0)
    {
    ans += yy[seg[f].r] - yy[seg[f].l];
    }
    else if (seg[f].r - seg[f].l > 1)
    {
    query(f<<1, ans);
    query(f<<1|1, ans);
    }
    }

    int main()
    {
    double x1, y1, x2, y2, ans, res;
    int N, ca = 1;;
    while (scanf("%d", &N), N)
    {
    res = 0;
    map<double,int>mp;
    for (int i = 1, j = 1; i <= N; ++i, j += 2)
    {
    scanf("%lf %lf %lf %lf", &x1, &y1, &x2, &y2);
    e[j].x = x1, e[j].y1 = y1, e[j].y2 = y2;
    e[j].lr = 1;
    e[j+1].x = x2, e[j+1].y1 = y1, e[j+1].y2 = y2;
    e[j+1].lr = -1;
    yy[j] = y1, yy[j+1] = y2;
    }
    sort(e+1, e+1+2*N);
    sort(yy+1, yy+1+2*N);
    int cnt = unique(yy+1, yy+1+2*N) - (yy+1);
    creat(1, 1, cnt);
    for (int i = 1; i <= cnt; ++i)
    {
    mp[yy[i]] = i;
    // printf("yy= %lf\n", yy[i]);
    }
    for (int i = 1; i < 2*N; ++i)
    {
    ans = 0;
    modify(1, mp[e[i].y1], mp[e[i].y2], e[i].lr);
    query(1, ans);
    res += ans * (e[i+1].x - e[i].x);
    // printf("res = %lf\n", res);
    }
    printf("Test case #%d\nTotal explored area: %.2lf\n\n", ca++, res);
    }
    return 0;
    }



  • 相关阅读:
    Python 函数与函数式编程
    Python 字符编码与转码
    Python 读写txt文件操作
    两阶段事务总结
    MPPDB集群高可用设计
    MPPDB中的各个组件
    IntelliJ IDEA2016学习小结
    mysql免安装版配置
    理想的智能机
    java对象的大小
  • 原文地址:https://www.cnblogs.com/Lyush/p/2367395.html
Copyright © 2011-2022 走看看