POJ1177(扫描线求周长并)
题意:。。求周长并。。。
解析:参考求面积并
图借鉴自:https://www.cnblogs.com/shuaiwhu/archive/2012/04/22/2464876.html

自下而上扫描 首先 加GH 接着 加 Node[1].numseg * 2 *(Edge[i+1].y - Edge[i].y)即两条竖边 然后 加 BD 但这时要减去GH 因为 LN = GH 重复加了一次
依次推理
与面积并不同的是 最上面的边不要忘了加上。。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <cmath>
#define mem(a, b) memset(a, b, sizeof(a))
using namespace std;
const int maxn = , INF = 0x7fffffff;
int X[maxn]; struct node{
int l, r, w; // l 和 r 分别为线段树的左右端点 w记录边重叠的情况
int numseg; // 记录竖边的对数
int lx, rx, sum; // sum代表当前区间线段的长度,lx和rx为线段的真实端点
bool lcover, rcover; // 标记当前区间的左右端点 与 numseg有关
}Node[maxn*]; struct edge{ // 存边
int lxx, rxx, y;
int f;
}Edge[maxn]; int cmp(edge a, edge b)
{
return a.y < b.y;
} void build(int k, int ll, int rr)
{
Node[k].l = ll, Node[k].r = rr;
Node[k].lx = X[ll];
Node[k].rx = X[rr];
Node[k].w = Node[k].numseg = , Node[k].sum = ;
Node[k].lcover = Node[k].rcover = false;
if(ll + == rr) return;
int m = (ll + rr) / ;
build(k*, ll, m);
build(k*+, m, rr);
} void down(int k)
{
if(Node[k].w > )
{
Node[k].sum = Node[k].rx - Node[k].lx;
Node[k].numseg = ;
Node[k].lcover = Node[k].rcover = true;
return;
}
if(Node[k].l + == Node[k].r)
{
Node[k].sum = ;
Node[k].numseg = ;
Node[k].lcover = Node[k].rcover = false;
}
else
{
Node[k].sum = Node[k*].sum + Node[k*+].sum;
Node[k].lcover = Node[k*].lcover, Node[k].rcover = Node[k*+].rcover;
Node[k].numseg = Node[k*].numseg + Node[k*+].numseg;
if(Node[k*].rcover && Node[k*+].lcover) Node[k].numseg--; //注意这里是左区间的右端点 和 右区间的左端点
}
} void update(int k, edge e)
{
if(Node[k].lx == e.lxx && Node[k].rx == e.rxx)
{
Node[k].w += e.f;
down(k);
return;
}
if(e.rxx <= Node[k*].rx) update(k*, e);
else if(e.lxx >= Node[k*+].lx) update(k*+, e);
else
{
edge temp = e;
temp.rxx = Node[k*].rx;
update(k*, temp);
temp = e;
temp.lxx = Node[k*+].lx;
update(k*+, temp);
}
down(k);
} int main()
{
int n, cnt = ;
scanf("%d",&n);
for(int i=; i<n; i++)
{
int x1, x2, y1, y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
Edge[++cnt].lxx = x1, Edge[cnt].rxx = x2, Edge[cnt].y = y1, Edge[cnt].f = ;
X[cnt] = x1;
Edge[++cnt].lxx = x1, Edge[cnt].rxx = x2, Edge[cnt].y = y2, Edge[cnt].f = -;
X[cnt] = x2;
}
sort(Edge+, Edge+cnt+, cmp);
sort(X+, X+cnt+);
int m = unique(X+, X+cnt+) - (X+);
build(, , m);
int ret = , last = ;
for(int i=; i<cnt; i++)
{
update(, Edge[i]);
ret += abs(Node[].sum - last); // 横边
ret += Node[].numseg * * (Edge[i+].y - Edge[i].y); // 加竖边
last = Node[].sum;
}
update(, Edge[cnt]);
ret += abs(Node[].sum - last); printf("%d\n",ret); return ;
}
POJ1177(扫描线求周长并)的更多相关文章
- N - Picture - poj 1177(扫描线求周长)
题意:求周长的,把矩形先进行融合后的周长,包括内周长 分析:刚看的时候感觉会跟棘手,让人无从下手,不过学过扫描线之后相信就很简单了吧(扫描线的模板- -),还是不说了,下面是一精确图,可以拿来调试数据 ...
- HDU 1828 Picture(线段树扫描线求周长)
Picture Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- poj 1177 --- Picture(线段树+扫描线 求矩形并的周长)
题目链接 Description A number of rectangular posters, photographs and other pictures of the same shape a ...
- 扫描线矩形周长的并 POJ1177
//扫描线矩形周长的并 POJ1177 // 我是按x轴 #include <iostream> #include <cstdio> #include <cstdlib& ...
- HDU-1828 Picture(扫描线 求矩形并的周长)
http://acm.hdu.edu.cn/showproblem.php?pid=1828 Time Limit: 6000/2000 MS (Java/Others) Memory Limi ...
- hdu1828 Picture(线段树+扫描线+矩形周长)
看这篇博客前可以看一下扫描线求面积:线段树扫描线(一.Atlantis HDU - 1542(覆盖面积) 二.覆盖的面积 HDU - 1255(重叠两次的面积)) 解法一·:两次扫描线 如图我们可以 ...
- 编写一个Shape类,具有属性:周长和面积; 定义其子类三角形和矩形,分别具有求周长的方法。 定义主类E,在其main方法中创建三角形和矩形类的对象, 并赋给Shape类的对象a、b,使用对象a、b来测试其特性。
package shape; public class Shape { //定义成员变量 private double zhouchang; private double mianji; public ...
- C# 定积分求周长&面积原理 代码实现
前言: 前些日子,因为工作原因,接触到了求解曲线周长,真的是搞了很久,学生时代真的很简单,但是如今的我来说,忘记了....很多人跟我应该一样. 所以来巩固加强一下记忆.一开始的时候,求周长嘛,找公式呗 ...
- TZOJ 2569 Wooden Fence(凸包求周长)
描述 Did you ever wonder what happens to your money when you deposit them to a bank account? All banks ...
随机推荐
- rc/rs的区别 -- 多层次分析
1.rs是rc的升级版本,rs一般会结合deployment 2.rc的pod如果要配置镜像等内容,要修改后删除原来的rc再创建 命令式,影响业务比较大 3.rs一般配合deployment,可以动 ...
- 如何通过C#开发调用Skyline软件中提供的小工具
熟悉Skyline的朋友会知道,在TerraBuilder和TerraExplorer Pro软件的安装目录里,提供了很多个小工具(exe程序): 虽然我们看不到这些小工具的源代码,但我们还是可以在自 ...
- SecureRandom
我们知道,Random类中实现的随机算法是伪随机,也就是有规则的随机.在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字. 相同种子数的Ra ...
- [03] Spring "Hello World"
0.写在前面的话 本篇以一个简单的示例,描述了Spring通过容器对于Java类的装载和获取.在以下我们可以看到,有一个Java类Coder,我们全程并没有手动调用new来进行实例化,而是从Sprin ...
- 《MySQL必知必会》[07] 管理事务处理
1.管理事务处理 一个或多个数据库操作(查询/更新等)组成"事务",也就是说,事务实际上是一组按顺序执行的操作单位: 原子性:整个事务为整体执行,要么执行,要么不执行,不能出现执行 ...
- 关于PHP程序员技术职业生涯规划
看到很多PHP程序员职业规划的文章,都是直接上来就提Linux.PHP.MySQL.Nginx.Redis.Memcache.jQuery这些,然后就直接上手搭环境.做项目,中级就是学习各种PHP框架 ...
- Swift开发iOS项目实战视频教程(二)---图片与动画
本课主要介绍UIImageview.NSTimer的使用.并介绍了一种动画实现方式. 本教程摒弃枯燥的语法和知识解说.全是有趣有料的项目实战! 视频优酷链接:v.youku.com/v_show/id ...
- C# SignalR 即时通信
MSDN教程:https://docs.microsoft.com/en-us/aspnet/signalr/ 个人博客:http://www.cnblogs.com/zhili/p/SignalRQ ...
- BodeAbp服务端介绍
BodeAbp服务端只提供api,绝大部分api通过abp的动态WebApi机制提供,原理可以参考这篇文章:http://www.cnblogs.com/1zhk/p/5418694.html 与业务 ...
- 剑指offer:二叉树中和为某一值的路径
本来这只是一个普通的算法题,但是当初自己OJ上提交时,总是提交失败,而我自己认定程序逻辑没有任何问题.然后开始就在本机上调试,结果发现这是由于Python的对象机制而引发的.所以先把问题算法题贴出来, ...