POJ 1151Atlantis 扫描线+线段树求矩形面积并
- #include <iostream>
- #include <vector>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #include <cmath>
- #include <map>
- #include <set>
- #include <string>
- #include <queue>
- #include <stack>
- #include <bitset>
- using namespace std;
- #define pb(x) push_back(x)
- #define ll long long
- #define mk(x, y) make_pair(x, y)
- #define lson l, m, rt<<1
- #define mem(a) memset(a, 0, sizeof(a))
- #define rson m+1, r, rt<<1|1
- #define mem1(a) memset(a, -1, sizeof(a))
- #define mem2(a) memset(a, 0x3f, sizeof(a))
- #define rep(i, n, a) for(int i = a; i<n; i++)
- #define fi first
- #define se second
- typedef pair<int, int> pll;
- const double PI = acos(-1.0);
- const double eps = 1e-;
- const int mod = 1e9+;
- const int inf = ;
- const int dir[][] = { {-, }, {, }, {, -}, {, } };
- const int maxn = ;
- struct segment
- {
- double l, r, h;
- int flag;
- segment(){}
- segment(double l, double r, double h, int flag):l(l), r(r), h(h), flag(flag){}
- bool operator < (segment a) const
- {
- return h<a.h;
- }
- }line[maxn];
- double a[maxn], sum[maxn<<];
- int cover[maxn<<];
- void pushUp(int rt, int l, int r) {
- if(cover[rt]) {
- sum[rt] = a[r+]-a[l];
- } else if(l == r) {
- sum[rt] = ;
- } else {
- sum[rt] = sum[rt<<]+sum[rt<<|];
- }
- }
- void update(int L, int R, int l, int r, int rt, int flag) {
- if(L<=l&&R>=r) {
- cover[rt] += flag;
- pushUp(rt, l-, r-);
- return ;
- }
- int m = l+r>>;
- if(L<=m)
- update(L, R, lson, flag);
- if(R>m)
- update(L, R, rson, flag);
- pushUp(rt, l-, r-);
- }
- int main()
- {
- int n, cnt, k = ;
- double x1, y1, x2, y2;
- while(scanf("%d", &n)&&n) {
- cnt = ;
- mem(cover);
- for(int i = ; i<n; i++) {
- scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2);
- line[cnt] = segment(x1, x2, y1, );
- a[cnt++] = x1;
- line[cnt] = segment(x1, x2, y2, -);
- a[cnt++] = x2;
- }
- sort(a, a+cnt);
- sort(line, line+cnt);
- double ans = ;
- int num = unique(a, a+cnt)-a;
- for(int i = ; i<cnt; i++) {
- int L = lower_bound(a, a+num, line[i].l)-a+;
- int R = lower_bound(a, a+num, line[i].r)-a;
- update(L, R, , num, , line[i].flag);
- ans += sum[]*(line[i+].h-line[i].h);
- }
- printf("Test case #%d\n", k++);
- printf("Total explored area: %.2f\n\n", ans);
- }
- return ;
- }
POJ 1151Atlantis 扫描线+线段树求矩形面积并的更多相关文章
- POJ 1151 Atlantis 线段树求矩形面积并 方法详解
第一次做线段树扫描法的题,网搜各种讲解,发现大多数都讲得太过简洁,不是太容易理解.所以自己打算写一个详细的.看完必会o(∩_∩)o 顾名思义,扫描法就是用一根想象中的线扫过所有矩形,在写代码的过程中, ...
- HDU - 1255 覆盖的面积(线段树求矩形面积交 扫描线+离散化)
链接:线段树求矩形面积并 扫描线+离散化 1.给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 2.看完线段树求矩形面积并 的方法后,再看这题,求的是矩形面积交,类同. 求面积时,用被覆 ...
- POJ 1151 / HDU 1542 Atlantis 线段树求矩形面积并
题意:给出矩形两对角点坐标,求矩形面积并. 解法:线段树+离散化. 每加入一个矩形,将两个y值加入yy数组以待离散化,将左边界cover值置为1,右边界置为2,离散后建立的线段树其实是以y值建的树,线 ...
- 【hdu1542】线段树求矩形面积并
分割线内容转载自http://hzwer.com/879.html ------------------------------------------------------------------ ...
- HDU 1828 / POJ 1177 Picture --线段树求矩形周长并
题意:给n个矩形,求矩形周长并 解法:跟求矩形面积并差不多,不过线段树节点记录的为: len: 此区间线段长度 cover: 此区间是否被整个覆盖 lmark,rmark: 此区间左右端点是否被覆盖 ...
- 【hdu1255】线段树求矩形面积交
题意大概就是上图这个样子.<=100组测试数据,每组<=1000个矩形. 题解: 这个问题怎么解决..做了上一题矩形面积并应该就会了.. 对于每个节点维护3个值: cnt:该节点所代表的这 ...
- HDU 1255 覆盖的面积 (扫描线 线段树 离散化 矩形面积并)
题目链接 题意:中文题意. 分析:纯手敲,与上一道题目很相似,但是刚开始我以为只是把cnt>=0改成cnt>=2就行了,. 但是后来发现当当前加入的线段的范围之前 还有线段的时候就不行了, ...
- UVA 11983 Weird Advertisement --线段树求矩形问题
题意:给出n个矩形,求矩形中被覆盖K次以上的面积的和. 解法:整体与求矩形面积并差不多,不过在更新pushup改变len的时候,要有一层循环,来更新tree[rt].len[i],其中tree[rt] ...
- HDU 1542.Atlantis-线段树求矩形面积并(离散化、扫描线/线段树)-贴模板
好久没写过博客了,这学期不是很有热情去写博客,写过的题也懒得写题解.现在来水一水博客,写一下若干年前的题目的题解. Atlantis Time Limit: 2000/1000 MS (Java/Ot ...
随机推荐
- JSON.parse()的异常怎么处理;
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- hibernate中文查询时无查询结果
原因很简单,问题在于我连接mysql用的url时,没有指定字符集,导致查询不到任何数据 问题出在 hibernate.xml配置文件中: 将 <property name="jdbcU ...
- CodeForces - 61E Enemy is weak
Description The Romans have attacked again. This time they are much more than the Persians but Shapu ...
- 发现一个名为“Douyu”的国人项目
刚刚在javaeye看到一个名为Douyu的国人项目,认为搞下去未来可能非常有意思,放到blog上做个标记. ——————下面是转载的作者原文——————— 原文地址例如以下:http://zhh20 ...
- java中关于如何运行jar格式程序的说明
通常情况下,我们用打包工具如Eclipse的export工具制作的jar包是无法通过鼠标双击来运行的. 此时我们需要启动DOS窗体,在DOS窗体中输入java命令运行程序(前提是你的环境变量class ...
- C# 第三方控件 下面的Item不显示了
当高版本的第三方版本 替换成低版本的第三方后,item,不显示了之后,请试着再次在这基础上添加一个Item,观察这个Item和原来已经在的却不显示的Item的区别在哪里.然后去源程序正常文件哪里 将这 ...
- Oracle的字符替换函数translate用法
参考文档如下:http://www.banping.com/2009/05/18/oracle_function_translate/ Oracle提供了一个字符替换函数translate,不同于re ...
- C++ template学习一(函数模板和模板函数)
函数模板和模板函数(1)函数模板函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计.它的最大特点是把函数使用的数据类型作为参数.函数模板的声明形式为:templat ...
- As Easy As A+B
Problem Description These days, I am thinking about a question, how can I get a problem as easy as A ...
- J - 今年暑假不AC
J - 今年暑假不AC Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit ...