扫描线专题 hdu1255

hdu1255

求覆盖至少两次的面积,和直接求覆盖面积比,就是保证cover>1就可以了。

没有进行lazy操作,因为每一次更新伴随着询问,感觉没有必要。982MS水过。

#include <bits/stdc++.h>
#define clr(x,c) memset(x,c,sizeof(x))
using namespace std;
const int N = 20005;

struct ScanLine {
    double x;
    double upY, downY;
    int flag;
    bool operator<(const ScanLine a) const {
        return x < a.x;
    }
    ScanLine() {}
    ScanLine(double x, double y1, double y2, int f) : x(x), upY(y1), downY(y2), flag(f) {}
} line[N];

double tr[N];
int cover[N];
double yy[N];

#define lson (o<<1)
#define rson (o<<1|1)
#define mid ((l+r)>>1)
int yl, yr, v;

double update(int o, int l, int r)
{
    if (yl > r || yr < l) return 0;

    if (l == r) {
        cover[o] += v;
        if (cover[o] > 1) return tr[o] = yy[r + 1] - yy[l];
        return tr[o] = 0;
    }

    if (yl <= mid) update(lson, l, mid);
    if (yr > mid) update(rson, mid + 1, r);

    return tr[o] = tr[lson] + tr[rson];
}

int main()
{
    int n;
    int t;
    scanf("%d", &t);
    while (t--) {
        scanf("%d", &n);
        int cnt = 0;
        double x1, y1, x2, y2;
        for (int i = 0; i < n; ++i) {
            scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2);
            line[++cnt] = ScanLine(x1, y2, y1, 1);
            yy[cnt] = y1;
            line[++cnt] = ScanLine(x2, y2, y1, -1);
            yy[cnt] = y2;
        }
        sort(yy + 1, yy + cnt + 1);
        sort(line + 1, line + cnt + 1);
        int len = unique(yy + 1, yy + cnt + 1) - yy - 1;
        clr(cover, 0);
        clr(tr, 0);
        double ans = 0;
        for (int i = 1; i < cnt; ++i) {
            yl = lower_bound(yy+1, yy+len+1, line[i].downY) - yy;
            yr = lower_bound(yy+1, yy+len+1, line[i].upY) - yy - 1;
            v = line[i].flag;
            ans += update(1, 1, len) * (line[i+1].x - line[i].x);
        }
        printf("%.2f\n", ans);
    }
	return 0;
}
时间: 2025-01-06 19:14:31

扫描线专题 hdu1255的相关文章

hdu1255 覆盖的面积 线段树-扫描线

矩形面积并 线段树-扫描线裸题 1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #include<math.h> 5 using namespace std; 6 const int maxm=2e3+5; 7 const double eps=1e-5; 8 9 struct seg{ 10 double x,y1,y2; 11 int c; 12 bool operator

【专题】偏序,扫描线

[关键字]偏序,数点,树状数组,线段树,扫描线. 因为涉及多种算法,所以整合到一起. [扫描线] 二维数点,偏序 ★数点问题 ★关于偏序问题的一些总结 一维偏序:排序二分 树状数组 二维偏序:排序扫描线+树状数组(差分)/线段树 三维偏序:排序扫描线+cdq分治+树状数组 排序扫描线+二维数据结构 基本思想是一维扫描线顺序扫描维护差分,一维用数据结构维护区间(线段树维护区间,树状数组差分维护前缀和). [BZOJ3161]布娃娃(扫描线+线段树) BZOJ 4059 Cerc2012 Non-b

HDU-1255 覆盖的面积 (扫描线)

题目大意:给若干个矩形,统计重叠次数不为0的面积. 题目分析:维护扫描线的长度时,只需要只统计覆盖次数大于1的区间即可.这是个区间更新,不过不能使用懒标记,但是数据规模不大,不用懒惰标记仍可以AC. 代码如下: # include<iostream> # include<cstdio> # include<map> # include<vector> # include<cstring> # include<algorithm> us

HDU1255 覆盖的面积 【扫描线】

覆盖的面积 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3743    Accepted Submission(s): 1838 Problem Description 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. Input 输入数据的第一行是一个正整数T(1<=T<=100),代表测试数据的数量.每个测试数

HDU1255 扫描线 矩形交面积 离散化

覆盖的面积 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 5595    Accepted Submission(s): 2810 Problem Description 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. Input 输入数据的第一行是一个正整数T(1<=T<=100),代表测试数据的数量.每个测试数据

hdu1255 矩阵的交(线段树+扫描线)

/* 不是叶子节点 ,且cnt=1.注意这里,cnt=1确切的意义是什么, 应该是,可以确定,这个区间被完全覆盖了1次, 而有没有被完全覆盖两次或以上则不知道无法确定,那么怎么怎么办了, 只要加上t[lch].s + t[rch].s 即,看看左右孩子区间被覆盖了一次或以上的长度, 那么叠加在双亲上就是双亲被覆盖两次或以上的长度 */ #include<stdio.h> #include<string.h> #include<algorithm> using names

HDU1255【线段树+扫描线】

#include<iostream> #include<cstdio> #include<algorithm> using namespace std; #define L(k) k<<1 #define R(k) k<<1|1 const int NO=1005; struct X { int l,r; int s; }p[NO<<2]; struct LINE { double l,r; double h; int s; }lin

&#183;专题」 线段树

PKU暑期培训第一天,这次培训人很多,但是感觉打酱油的也不少,不知道大牛有多少. 第一天都是讲线段树的,课件的话和往常一样,没什么变化. 具体的话,讲了线段树和树状数组.线段树的话讲了单点更新,成段更新,扫描线已经离散化. 然后随便提了提树状数组.估计明天再讲一点点,然后接着是讲并查集,多串匹配什么的. 线段树的题目我做得很少,以前看过HH大神的模板,想模仿来着,其实也没什么理解. 重新理解一下线段树吧. 线段树的用途,主要是维护区间问题,比如区间的单点更新操作,成段更新,扫描线等等.当然还有一

【POJ 2482】 Stars in Your Window(线段树+离散化+扫描线)

[POJ 2482] Stars in Your Window(线段树+离散化+扫描线) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11294   Accepted: 3091 Description Fleeting time does not blur my memory of you. Can it really be 4 years since I first saw you? I still remembe