推荐阅读这篇文章

这里仅根据上述文章进行一些补充。主要是注意这里线段树点的意义变成了“边”。比如+-----+-----+,看作3个点abc和两条边e1和e2,那么线段树中点a代表e1,点b代表e2。那么我们在算cover(想象成染黑)的时候,将(a,b,c)这一段染黑的时候,其实只需要染线段树中的a和b点即可!这里解释了,为什么染[l,r]的时候,实际上染的是[l, r - 1]。

但是,push_up的时候,线段树中的l,r对应实际点的l和r-1,所以要补上个1,这里解释的是为什么if(cover[rt]) seg[rt] = x[r + 1] - x[l];

最终代码:

#include <bits/stdc++.h>
using namespace std; const int maxN=2e2+;
int N, M, K, cas; #define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define rch rt<<1
#define lch rt<<1|1 int cov[maxN<<];
double T[maxN<<], x[maxN];
vector<double> v; struct Line {
double l, r, h; int fg;
Line(double a=, double b=, double c=, int d=):
l(a), r(b), h(c), fg(d){}
bool operator < (const Line &s2) const {return h < s2.h;}
};
vector<Line> ln; void push_up(int l, int r, int rt) {
if (cov[rt]) T[rt] = v[r + ] - v[l];
else if (l == r) T[rt] = ;
else T[rt] = T[lch] + T[rch];
}
void update(int L, int R, int f, int l, int r, int rt) {
if (L <= l && r <= R) {
cov[rt] += f;
push_up(l, r, rt);
return;
}
int m = (l + r) / ;
if (L <= m) update(L, R, f, lson);
if (R > m) update(L, R, f, rson);
push_up(l, r, rt);
}
int main () {
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
#endif cas = ;
while (~scanf("%d", &N) && N) {
v.clear(), ln.clear();
memset(cov, , sizeof cov), memset(T, , sizeof T); double x1, y1, x2, y2;
for (int i = ; i < N; ++i) {
scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2);
v.push_back(x1), v.push_back(x2);
ln.push_back(Line(x1, x2, y1, ));
ln.push_back(Line(x1, x2, y2, -));
}
sort(v.begin(), v.end()), sort(ln.begin(), ln.end());
v.erase(unique(v.begin(), v.end()), v.end()); double ans = ;
for (int i = ; i < (int)ln.size() - ; ++i) {
int L = lower_bound(v.begin(), v.end(), ln[i].l) - v.begin();
int R = lower_bound(v.begin(), v.end(), ln[i].r) - v.begin();
if (R > L)
update(L, R - , ln[i].fg, , v.size() - , );
ans += T[] * (ln[i + ].h - ln[i].h);
}
printf("Test case #%d\nTotal explored area: %.2lf\n\n", cas++, ans);
}
return ;
}

HDU 1542 矩形面积并的更多相关文章

  1. HDU 1542 矩形面积并【离散化+线段树+扫描线】

    <题目链接> 题目大意: 给你n个矩形,求出它们面积的并. 解题分析: 此题主要用到了扫描线的思想,现将各个矩形的横坐标离散化,然后用它们离散化后的横坐标(相当于将矩形的每条竖线投影在x轴 ...

  2. HDU 5251 矩形面积 (旋转卡壳)

    2015年百度之星程序设计大赛 - 初赛(1) 1006 比赛链接:2015年百度之星程序设计大赛 - 初赛(1) 题目链接:HDU 5251 Problem Description 小度熊有一个桌面 ...

  3. HDU 5251 矩形面积(二维凸包旋转卡壳最小矩形覆盖问题) --2015年百度之星程序设计大赛 - 初赛(1)

    题目链接   题意:给出n个矩形,求能覆盖所有矩形的最小的矩形的面积. 题解:对所有点求凸包,然后旋转卡壳,对没一条边求该边的最左最右和最上的三个点. 利用叉积面积求高,利用点积的性质求最左右点和长度 ...

  4. (HDU 1542) Atlantis 矩形面积并——扫描线

    n个矩形,可以重叠,求面积并. n<=100: 暴力模拟扫描线.模拟赛大水题.(n^2) 甚至网上一种“分块”:分成n^2块,每一块看是否属于一个矩形. 甚至这个题就可以这么做. n<=1 ...

  5. HDU 1542 Atlantis(矩形面积并)

    HDU 1542 Atlantis 题目链接 题意:给定一些矩形,求面积并 思路:利用扫描线,因为这题矩形个数不多,直接暴力扫就能够了.假设数据大.就要用线段树 代码: #include <cs ...

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

    求矩形面积并,离散化加线段树. 扫描线法: 用平行x轴的直线扫,每次ans+=(下一个高度-当前高度)*当前覆盖的宽度. #include<algorithm> #include<c ...

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

    题意:给出矩形两对角点坐标,求矩形面积并. 解法:线段树+离散化. 每加入一个矩形,将两个y值加入yy数组以待离散化,将左边界cover值置为1,右边界置为2,离散后建立的线段树其实是以y值建的树,线 ...

  8. hdu 1542 扫描线求矩形面积的并

    很久没做线段树了 求矩形面积的并分析:1.矩形比较多,坐标也很大,所以横坐标需要离散化(纵坐标不需要),熟悉离散化后这个步骤不难,所以这里不详细讲解了,不明白的还请百度2.重点:扫描线法:假想有一条扫 ...

  9. 【HDU 1542】Atlantis 矩形面积并(线段树,扫描法)

    [题目] Atlantis Problem Description There are several ancient Greek texts that contain descriptions of ...

随机推荐

  1. spring 线程异步执行

    多线程并发处理起来通常比较麻烦,如果你使用spring容器来管理业务bean,事情就好办了多了.spring封装了Java的多线程的实现,你只需要关注于并发事物的流程以及一些并发负载量等特性,具体来说 ...

  2. 10w定时任务,如何高效触发超时

    一.缘起 很多时候,业务有定时任务或者定时超时的需求,当任务量很大时,可能需要维护大量的timer,或者进行低效的扫描. 例如:58到家APP实时消息通道系统,对每个用户会维护一个APP到服务器的TC ...

  3. 迁移SharePoint搜索服务至新的服务器

    转自:http://blog.fpweb.net/move-sharepoint-2013-search-components-to-new-server/#.V_w4JZH_6uh In this ...

  4. Java代码签名证书申请和使用指南

    第1步 下载签名工具 Step 1: Download Signing Tools 如果您还没有签名工具,请到SUN公司网站免费下载:http://java.sun.com/j2se/,推荐下载JDK ...

  5. Numpy API

    Numpy API 矩阵操作 np.squeeze(mat): 将mat降维 np.linalg.norm(x, axis=1, keepdims=True): keepdim=True是防止出现sh ...

  6. 使用Jprofiler+jmeter进行JVM性能调优

    一.JProfiler简介 JProfiler 是一个商业授权的Java剖析工具,由EJ技术有限公司,针对的Java EE和Java SE应用程序开发的.它把CPU.执行绪和内存的剖析组合在一个强大的 ...

  7. Android 直接通过JNI访问驱动

    package com.yang.jniaccesshardware; import android.os.Bundle; import android.support.v7.app.AppCompa ...

  8. 面向对象(基础oop)之结构与数组高级

    大家好,我叫李京阳,,很高兴认识大家,之所以我想开一个自己的博客,就是来把自己所了解的知识点通过自己的话写一下,希望被博客园的朋友们点评和一起讨论一下,也希望从博客园中多认识一些软件开发人员!现在我开 ...

  9. Java学习--jsp内置对象

    九个内置对象,其中Out,request,response,session,application常用 get与post区别: request对象: response对象: 请求转发与请求重定向的区别 ...

  10. mysql分表,批量生成数据

    一.mysql的分表策略 根据经验,Mysql表数据一般达到百万级别,查询效率会很低,容易造成表锁,甚至堆积很多连接,直接挂掉: 1,水平分割: 水平(横向)拆分:将同一个表的数据进行分块保存到不同的 ...