POJ 1389 Area of Simple Polygons | 扫描线
#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 | 扫描线的更多相关文章
- POJ 1389 Area of Simple Polygons 扫描线+线段树面积并
---恢复内容开始--- LINK 题意:同POJ1151 思路: /** @Date : 2017-07-19 13:24:45 * @FileName: POJ 1389 线段树+扫描线+面积并 ...
- [poj] 1389 Area of Simple Polygons
原题 线段树+扫描线 对于这样一个不规则图形,我们要求他的面积有两种方法,割和补. 补显然不行,因为补完你需要求补上去的内部分不规则图形面积-- 那么怎么割呢? 像这样: 我们就转化成了无数个矩形的和 ...
- POJ Area of Simple Polygons 扫描线
这个题lba等神犇说可以不用离散化,但是我就是要用. 题干: Description There are N, <= N <= , rectangles -D xy-plane. The ...
- POJ1389:Area of Simple Polygons——扫描线线段树题解+全套代码注释
http://poj.org/problem?id=1389 题面描述在二维xy平面中有N,1 <= N <= 1,000个矩形.矩形的四边是水平或垂直线段.矩形由左下角和右上角的点定义. ...
- 【POJ 1389】Area of Simple Polygons(线段树+扫描线,矩形并面积)
离散化后,[1,10]=[1,3]+[6,10]就丢了[4,5]这一段了. 因为更新[3,6]时,它只更新到[3,3],[6,6]. 要么在相差大于1的两点间加入一个值,要么就让左右端点为l,r的线段 ...
- Area of Simple Polygons
poj1389:http://poj.org/problem?id=1389 题意:求矩形面积的并题解:扫描线加线段树 同poj1389 #include<iostream> #inclu ...
- POJ1389 Area of Simple Polygons 线段树
POJ1389 给定n个整数点矩形,求面积并. 显然ans必然是整数. 记录若干个事件,每个矩形的左边的竖边记为开始,右边的竖边记为结束. 进行坐标离散化后用线段树维护每个竖的区间, 就可以快速积分了 ...
- poj 1389(离散化+计算几何)
Area of Simple Polygons Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3412 Accepted ...
- poj 1265 Area 面积+多边形内点数
Area Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5861 Accepted: 2612 Description ...
随机推荐
- CRC32为例详细解析(菜鸟至老鸟进阶)
CRC-知识解析 cyclic redundancy check 写在前面的话: 之前在做学校项目的时候用到了CRC 原理,但在网上查找的过程中,发现讲解CRC知识的资源很多,但是对新手比较友好的.讲 ...
- 牛客小白月赛2 G 文 【模拟】
链接:https://www.nowcoder.com/acm/contest/86/G来源:牛客网 题目描述 Sεlιнα(Selina) 开始了新一轮的男友海选.她要求她的男友要德智体美劳样样都全 ...
- 《JSON笔记之二》----封装JSONUtil
许多java开发人员对于fastjson再也熟悉不过了,这是alibaba开源的依赖,使用fastjson可以使我们很容易的把请求json串转换成为我们所需要的对象.list.map等对象格式,对于开 ...
- win8电脑字体出现方格的解决方法
一般电脑出现乱码有几种可能,最常见的可能就是电脑字体的丢失,其次就是电脑字体被病毒所损坏,因此,首先我们要做的就是下载字体并进行安装. 下载 simsun.tcc点击安装,如果电脑字体依然是这种情况( ...
- C语言进阶——浮点数的秘密03
浮点数在内存中的储存方式为:符号位 指数位 尾数 float和double类型的数据在计算机内部的表实方法是一样的,但是由于所占的存贮空间的不同,其分别能表示的数值范围和精度不同. 类型 f符号位 指 ...
- 使用windows live writer写cnblog-1 安装wlr
Writer:在本地编辑有声在色的博客内容,发布到你的网络博客! 离线安装文件下载地址:http://dx1.itopdog.cn/soft/wlsetup-all.rar 下了好几个离线版本的, ...
- PHP代码审计4-漏洞挖掘思路
漏洞挖掘思路 漏洞形成的条件 1.变量可控制 2.变量可到达有利用价值的函数(危险函数) 漏洞造成的效果 漏洞的利用效果取决于最终的函数功能,变量进入什么样的函数就导致什么样的效果 危险函数 文件包含 ...
- 2 Mongodb基本操作
1.基本操作 MongoDB将数据存储为一个文档,数据结构由键值(key=>value)对组成 MongoDB文档类似于JSON对象,字段值可以包含其他文档.数组.文档数组 安装管理mongod ...
- 世界未解之谜之----------Android Gradle
今天运行项目,运行的debug出来的包竟然是命名过的,但是我的buildTypes里面的debug 并没有执行重命名操作.很奇怪,我的猜测是: 执行buildTypes的时候,虽然是assermdeb ...
- JavaScript - 问题集 - 含function的json对象与json字符串之间相互转换
基本的转换为:JSON.parse与JSON.stringify. 但是json数据中含function,则转换后,function会丢失,如: var json={ test:'test', log ...