poj 1151(离散化+矩形面积并)

题目链接:http://poj.org/problem?id=1151

关于离散化,这篇博客讲的很好:http://www.cppblog.com/MiYu/archive/2010/10/15/129999.aspx

我线段树还是不会写这个。。

借个图:

///离散化
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <cmath>
using namespace std;
const int N = 220;
const double eps = 1e-10;
struct Rec{
    double x1,y1;
    double x2,y2;
}rec[N];
double x[N],y[N];
int vis[N][N];
int n,k;
int cmp(double a,double b){
    if(a<b) return 1;
    return 0;
}
void input(){
    k = 0;
    for(int i=0;i<n;i++){
        scanf("%lf%lf%lf%lf",&rec[i].x1,&rec[i].y1,&rec[i].x2,&rec[i].y2);
        x[k] = rec[i].x1,y[k++] = rec[i].y1;
        x[k] = rec[i].x2,y[k++] = rec[i].y2;
    }
    sort(x,x+k,cmp);
    sort(y,y+k,cmp);
}
int binary1(double value){
    int mid,l=0,r=k-1;
    while(l<r){
        mid = (l+r)>>1;
        if(fabs(x[mid]-value)<eps) return mid;
        if(x[mid]<value) l = mid+1;
        else r = mid-1;
    }
    return l;
}
int binary2(double value){
    int mid,l=0,r=k-1;
    while(l<r){
        mid = (l+r)>>1;
        if(fabs(y[mid]-value)<eps) return mid;
        if(y[mid]<value) l = mid+1;
        else r = mid-1;
    }
    return l;
}
double solve(){
    int t1,t2,t3,t4;
    for(int i=0;i<n;i++){
        t1 = binary1(rec[i].x1);
        t2 = binary1(rec[i].x2);
        t3 = binary2(rec[i].y1);
        t4 = binary2(rec[i].y2);
        for(int j=t1;j<t2;j++){
            for(int l = t3;l<t4;l++){
                vis[j][l]=1;
            }
        }
    }
    double area = 0;
    for(int i=0;i<k;i++){
        for(int j=0;j<k;j++){
            area+=vis[i][j]*(x[i+1]-x[i])*(y[j+1]-y[j]);
        }
    }
    return area;
}
int main()
{
    int cnt=1;
    while(scanf("%d",&n)!=EOF&&n){
        memset(vis,0,sizeof(vis));
        input();
        printf("Test case #%d\nTotal explored area: %.2lf\n\n",cnt++,solve());
    }
    return 0;
}
时间: 2024-10-21 07:54:52

poj 1151(离散化+矩形面积并)的相关文章

poj 1151 Atlantis(矩形面积并)

题意:每组给出矩形左上角和右下角坐标,求矩形面积并: 思路:沿水平方向计算面积并:(切成水平条): #include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> using namespace std; const int maxn=500; struct node{ double x; int l,r,t; //t为上下边标志

poj 1151 求矩形面积并 (线段树扫描线)

题意: 给出n个矩形的左下角和右上角坐标,求这n个矩形所构成的面积 思路: 线段树扫描线 这是第一次做到线段树扫描线,刚开始也不懂 如果不懂,可以看: http://www.cnblogs.com/scau20110726/archive/2013/04/12/3016765.html 和 http://www.faceye.net/search/69289.html 我是看第一个链接弄懂的 然后学习了第二位的方法 代码上也有比较详细的注释,想可以帮到大家 code: #include<cstd

[POJ 2559] 最大矩形面积

单调栈模板题 提供一种奇技淫巧的解法,均摊O(n) #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #define int long long const int N = 100010; int ans, n; int a[N]; int l[N], r[N]; inline int read() { int x = 0, f = 1; char ch

POJ&#183;1151 Atlantis&#183;线段树求矩形面积并

题目在这:http://poj.org/problem?id=1151 Atlantis Time Limit: 1000MS   Memory Limit: 10000K Description There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some of these texts even include maps of parts of the is

POJ 1151 / HDU 1542 Atlantis 线段树求矩形面积并

题意:给出矩形两对角点坐标,求矩形面积并. 解法:线段树+离散化. 每加入一个矩形,将两个y值加入yy数组以待离散化,将左边界cover值置为1,右边界置为2,离散后建立的线段树其实是以y值建的树,线段树维护两个值:cover和len,cover表示该线段区间目前被覆盖的线段数目,len表示当前已覆盖的线段长度(化为离散前的真值),每次加入一条线段,将其y_low,y_high之间的区间染上line[i].cover,再以tree[1].len乘以接下来的线段的x坐标减去当前x坐标,即计算了一部

poj 1151 Atlantis (离散化 + 扫描线 + 线段树)

题目链接题意:给定n个矩形,求面积并,分别给矩形左上角的坐标和右上角的坐标. 分析: 1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 #include <cstring> 5 #include <cstdlib> 6 #include <algorithm> 7 #define LL __int64 8 #define lson l, mid, 2*rt

poj 3277 City Horizon (线段树 扫描线 矩形面积并)

题目链接 题意: 给一些矩形,给出长和高,其中长是用区间的形式给出的,有些区间有重叠,最后求所有矩形的面积. 分析: 给的区间的范围很大,所以需要离散化,还需要把y坐标去重,不过我试了一下不去重 也不会出错, 所有的区间都能列出来,只是在查找的时候费点事. 给的矩形相当于在同一水平线上的,也就是y1坐标相当于为0,其他的就和 poj 1151 Atlantis 差不多了. 我写的思路是按照矩形面积并的思路写的: 但是还有另一种方法也是挺简单的,就是把给的矩形按照高从小到大排序,然后依次插入线段树

【HDU 1542】Atlantis(线段树+离散化,矩形面积并)

求矩形面积并,离散化加线段树. 扫描线法: 用平行x轴的直线扫,每次ans+=(下一个高度-当前高度)*当前覆盖的宽度. #include<algorithm> #include<cstdio> #include<cstring> #define dd double #define ll long long #define N 201 using namespace std; struct P{dd s,e,h;int f;}p[N]; struct Tree{dd s

【POJ 1151】 Atlantis(离散化+扫描线)

[POJ 1151] Atlantis(离散化+扫描线) Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20223   Accepted: 7634 Description There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some of these texts even inclu