推荐阅读这篇文章

这里仅根据上述文章进行一些补充。主要是注意这里线段树点的意义变成了“边”。比如+-----+-----+,看作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. jQuery插件开发之windowScroll

    回首望,曾经洋洋得意的代码现在不忍直视.曾经看起来碉堡的效果现在也能稍微弄点出来.社会在往前发展,人也得向前迈进. 参考于搜狗浏览器4.2版本首页的上下滚动效果.主要实现整个窗口的上下和左右滚动逻辑, ...

  2. Android Studio 和 gradle 修改缓存文件夹路径

    Android Studio的缓存文件主要有四个文件夹,分别是 .android 这个文件夹是Android SDK生成的AVD(Android Virtual Device Manager)即模拟器 ...

  3. switch case :在JDK 7中,又加入了对String类型的支持,从此不用再写If-Else来判断字符串了

    switch的case语句可以处理int,short,byte,char类型的值, 因为short,byte,char都会转换成int进行处理,这一点也可以从生成的字节码看出. char a = 'e ...

  4. code EINTEGRITY,npm安装时候报错

    解决方法: 1.如果有package-lock.json文件,就删掉 2.管理员权限进入cmd 3.执行npm cache clean --force 4.之后再npm install 有时候网不好也 ...

  5. sql 解释顺序

    from:全量数据, where:数据过滤,生成新的虚表.个人主观上理解,where中的条件,如果涉及到join中的表,则会移动到相应的on条件中,减少后续生成的虚表大小. join:根据on中的条件 ...

  6. NUmericupdown控件

    Numericupdown控件是由system.windows.froms.Numericupdown类提供的,主要作用是将一个数按一定的值进行增加或减少.它主要有四个常用属性   Increment ...

  7. nvm安装最新稳定版node

    安装当前最新的稳定版. nvm install stable

  8. ios开发 学习积累20161024~20161026

    打算转ios开发工程师的岗位 今天看了下视频,自己吭呲吭呲几下开始写UI 先把Xcode8 的界面总结下 navigator ['nævɪɡetɚ] 导航器.浏览器 symbol navigator  ...

  9. 提交表单时,post方式无法提交(一种情况)

    tomcat6,设置文件上传不限制大小maxPostSize="0" 但是在tomcat7及以后版本,应设置为小于0,如maxPostSize="-1"  否则 ...

  10. Java 运行时数据区域

    1. 整体分类 程序计数器 虚拟机栈 本地方法栈 Java 堆 方法区 运行时常量池 直接内存 2. 程序计数器 每个线程一个计数器,线程的私有内存 指向的是字节码的内存地址? 如果线程执行的是 Ja ...