请戳此处

 #include<cstdio>
#include<algorithm>
#include<cstring>
#define N 1010
#define LEN 60010
using namespace std;
struct Edge
{
int l,r,h,f;
bool operator < (const Edge &a) const
{
if (h==a.h) return f<a.f;
return h<a.h;
}
}edge[N*];
int cnt,s[*LEN],cover[*LEN],mx;
//cover[i]表示节点i代表区间被覆盖的次数(可以重复覆盖)
//s[i]表示节点i代表区间被覆盖长度(不可重复)
long long ans;
void insert(int i,int l,int r,int x,int y,int k)
{
if (y<l || x>r) return;
if (x<=l && y>=r)
{
cover[i]+=k;
if (cover[i]>) s[i]=r-l+;//当cover大于0,区间一定被全覆盖
else if (l==r) s[i]=;
else s[i]=s[i*]+s[i*+];
return;
}
int mid=(l+r)>>;
insert(i*,l,mid,x,y,k);
insert(i*+,mid+,r,x,y,k);
if (cover[i]==) s[i]=s[*i]+s[*i+];//cover等于0就从左儿子和右儿子更新
return;
}
Edge make(int a,int b,int c,int d)
{
Edge ret;
ret.l=a,ret.r=b,ret.h=c,ret.f=d;
return ret;
}
int main()
{
int a,b,c,d;
while ()
{
cnt=ans=mx=;
while ()
{
scanf("%d%d%d%d",&a,&b,&c,&d);
mx=max(mx,c);
if (a==- && b==- && c==- && b==-) break;
edge[++cnt]=make(a,c,b,);
edge[++cnt]=make(a,c,d,-);
}
if (cnt==) break;
memset(cover,,sizeof(cover));
memset(s,,sizeof(s));
sort(edge+,edge++cnt);
insert(,,mx,edge[].l+,edge[].r,edge[].f);
for (int i=;i<=cnt;i++)
ans+=s[]*(edge[i].h-edge[i-].h),insert(,,mx,edge[i].l+,edge[i].r,edge[i].f);
printf("%lld\n",ans);
}
return ;
}

POJ 1389 Area of Simple Polygons | 扫描线的更多相关文章

  1. POJ 1389 Area of Simple Polygons 扫描线+线段树面积并

    ---恢复内容开始--- LINK 题意:同POJ1151 思路: /** @Date : 2017-07-19 13:24:45 * @FileName: POJ 1389 线段树+扫描线+面积并 ...

  2. [poj] 1389 Area of Simple Polygons

    原题 线段树+扫描线 对于这样一个不规则图形,我们要求他的面积有两种方法,割和补. 补显然不行,因为补完你需要求补上去的内部分不规则图形面积-- 那么怎么割呢? 像这样: 我们就转化成了无数个矩形的和 ...

  3. POJ Area of Simple Polygons 扫描线

    这个题lba等神犇说可以不用离散化,但是我就是要用. 题干: Description There are N, <= N <= , rectangles -D xy-plane. The ...

  4. POJ1389:Area of Simple Polygons——扫描线线段树题解+全套代码注释

    http://poj.org/problem?id=1389 题面描述在二维xy平面中有N,1 <= N <= 1,000个矩形.矩形的四边是水平或垂直线段.矩形由左下角和右上角的点定义. ...

  5. 【POJ 1389】Area of Simple Polygons(线段树+扫描线,矩形并面积)

    离散化后,[1,10]=[1,3]+[6,10]就丢了[4,5]这一段了. 因为更新[3,6]时,它只更新到[3,3],[6,6]. 要么在相差大于1的两点间加入一个值,要么就让左右端点为l,r的线段 ...

  6. Area of Simple Polygons

    poj1389:http://poj.org/problem?id=1389 题意:求矩形面积的并题解:扫描线加线段树 同poj1389 #include<iostream> #inclu ...

  7. POJ1389 Area of Simple Polygons 线段树

    POJ1389 给定n个整数点矩形,求面积并. 显然ans必然是整数. 记录若干个事件,每个矩形的左边的竖边记为开始,右边的竖边记为结束. 进行坐标离散化后用线段树维护每个竖的区间, 就可以快速积分了 ...

  8. poj 1389(离散化+计算几何)

    Area of Simple Polygons Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3412   Accepted ...

  9. poj 1265 Area 面积+多边形内点数

    Area Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5861   Accepted: 2612 Description ...

随机推荐

  1. Python线程创建与使用

    Python多为线程编程提供了两个简单明了的模块:thread和threading,Python3中已经不存thread模块,已经被改名为_thread,实际优先使用 threading模块. 1.P ...

  2. git 常用命令及仓库创建

    一.常用命令 1.添加到本地仓库缓存 git add . 2.查看本地仓库状态 git status 3.提交到本地仓库 git commit -am 'project init' 4.连接线上分支 ...

  3. Java中堆、栈,静态方法和非静态方法的速度问题

           一.堆和栈的速度性能分析 堆和栈是JVM内存模型中的2个重要组成部分,自己很早以前也总结过堆和栈的区别,基本都是从存储内容,存储空间大小,存储速度这几个方面来理解的,但是关于堆和栈的存储 ...

  4. rsync+lsyncd实现实时同步

    1.接收端安装rsync,修改/etc/rsyncd.conf配置文件,然后启动服务. uid = rootgid = rootuse chroot = nomax connection = 4sec ...

  5. 【Effective C++读书笔记】序

    C++ 是一个难学易用的语言! [C++为什么难学?] C++的难学,不仅在其广博的语法,以及语法背后的语义,以及语义背后的深层思维,以及深层思维背后的对象模型: C++的难学还在于它提供了四种不同而 ...

  6. 超简单开发自己的php框架一点都不难

    (转)https://blog.csdn.net/qq_33862644/article/details/79344331 写框架的极简思路: 接收,打印参数想怎么弄.如 获取配置文件的方法,根据传过 ...

  7. iOS各个版本的特点

    一.导航控制器中: iOS7: 栈顶控制器默认是320*480:控制器有64的高度看不见:

  8. contextmanager 的基本使用

    from contextlib import contextmanager 简化 With 语句: class MyResource:    def query(self):        print ...

  9. Android面试收集录6 事件分发机制

    转自:秋招面试宝典. 一. 基础认知 1.1 事件分发的对象是谁? 答:事件 当用户触摸屏幕时(View或ViewGroup派生的控件),将产生点击事件(Touch事件). Touch事件相关细节(发 ...

  10. 4,版本控制git --忽略特殊文件

    有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等,每次git status都会显示Untracked files ...,有强迫症的童鞋心里肯定 ...