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 = 10010, 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*4];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 = 0, Node[k].sum = 0;Node[k].lcover = Node[k].rcover = false;if(ll + 1 == rr) return;int m = (ll + rr) / 2;build(k*2, ll, m);build(k*2+1, m, rr); }void down(int k) {if(Node[k].w > 0){Node[k].sum = Node[k].rx - Node[k].lx;Node[k].numseg = 1;Node[k].lcover = Node[k].rcover = true;return;}if(Node[k].l + 1 == Node[k].r){Node[k].sum = 0;Node[k].numseg = 0;Node[k].lcover = Node[k].rcover = false;}else{Node[k].sum = Node[k*2].sum + Node[k*2+1].sum;Node[k].lcover = Node[k*2].lcover, Node[k].rcover = Node[k*2+1].rcover;Node[k].numseg = Node[k*2].numseg + Node[k*2+1].numseg;if(Node[k*2].rcover && Node[k*2+1].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*2].rx) update(k*2, e);else if(e.lxx >= Node[k*2+1].lx) update(k*2+1, e);else{edge temp = e;temp.rxx = Node[k*2].rx;update(k*2, temp);temp = e;temp.lxx = Node[k*2+1].lx;update(k*2+1, temp);}down(k); }int main() {int n, cnt = 0;scanf("%d",&n);for(int i=0; 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 = 1;X[cnt] = x1;Edge[++cnt].lxx = x1, Edge[cnt].rxx = x2, Edge[cnt].y = y2, Edge[cnt].f = -1;X[cnt] = x2;}sort(Edge+1, Edge+cnt+1, cmp);sort(X+1, X+cnt+1);int m = unique(X+1, X+cnt+1) - (X+1);build(1, 1, m);int ret = 0, last = 0;for(int i=1; i<cnt; i++){update(1, Edge[i]);ret += abs(Node[1].sum - last); // 横边ret += Node[1].numseg * 2 * (Edge[i+1].y - Edge[i].y); // 加竖边last = Node[1].sum;}update(1, Edge[cnt]);ret += abs(Node[1].sum - last);printf("%d\n",ret);return 0; }
转载于:https://www.cnblogs.com/WTSRUVF/p/9270352.html
POJ1177(扫描线求周长并)相关推荐
- 线段树扫描线求矩形周长详解
线段树扫描线求矩形周长详解 原创 wucstdio 最后发布于2018-04-24 16:12:09 阅读数 841 收藏 发布于2018-04-24 16:12:09 版权声明:本文为博主原创文章, ...
- TZOJ 2569 Wooden Fence(凸包求周长)
描述 Did you ever wonder what happens to your money when you deposit them to a bank account? All banks ...
- POJ1151基本的扫描线求面积
题意: 给定n个矩形的对角坐标,分别是左下和右上,浮点型,求矩形覆盖的面积. 思路: 基本的线段树扫描线求面积,没有坑点,不解释了,提示一点,有的题尤其是线段树扫描线的题需要离散 ...
- CF1368G Shifting Dominoes(扫描线求矩阵的并集)
CF1368G Shifting Dominoes problem solution code problem 题目链接 solution 求的是最后棋盘本质不同的个数,而本质不同等价于两个空格位置不 ...
- java里创建一个长方形类_定义一个长方形类,定义 求周长和面积的方法实例
/* 定义一个长方形类,定义 求周长和面积的方法, 然后定义一个测试了Test2,进行测试. 长方形的类: 成员变量: 长,宽 成员方法: 求周长:(长+宽)*2; 求面积:长*宽 注意: impor ...
- 定义一个长方形类,求周长和面积--学习笔记--16
1.变量什么时候定义为成员变量 如果这个变量是用来描述这个类的信息的,那么,该变量就应该定义为成员变量 2.变量的范围越小越好,因为能及时的被回收 3.定义一个长方形类,求周长和面积 然后定义一个Te ...
- 定义一个长方形类,定义 求周长和面积的方法,然后定义一个测试了Test,进行测试
定义一个长方形类,定义 求周长和面积的方法,然后定义一个测试了Test,进行测试. import java.util.Scanner; class ChangFangXing{private int ...
- POJ 1389 Area of Simple Polygons(扫描线求面积)
思路:纯纯扫描线求面积模板题,求点赞qaq. #include<iostream> #include<cstdio> #include<cstring> #incl ...
- 设计一个抽象类图形类,在该类中包含有至少两个抽象方法求周长和求面积,分别定义圆形类、长方形类、正方形类、三角形类来继承图形类,并实现上述两个方法
设计一个抽象类图形类,在该类中包含有至少两个抽象方法求周长和求面积,分别定义圆形类.长方形类.正方形类.三角形类来继承图形类,并实现上述两个方法 设计抽象类 就要使用abstract关键字,抽象类中的 ...
- Java6面向对象编程创建一个矩形类, 求周长 面积
package job; /** */ import java.util.Scanner; public class Space { /* 面向对象编程创建一个矩形类, 求周长 面积 */ publi ...
最新文章
- 显示Iframe指定位置
- c++中构造函数 、析构函数的作用域详解
- 当遇到用\来分隔字符串
- 演练 宠物店挑小动物 java 1615136001
- Facebook AI牛津提出带“轨迹注意力”的Video Transformer,在视频动作识别任务中性能SOTA!...
- python对csv数据提取某列的某些行_python pandas获取csv指定行 列的操作方法
- baacloud无法连接到_加入 Beta 版“Baacloud88” - TestFlight - Apple
- android 扇形统计动画,Android自定义View——扇形统计图的实现代码
- 解决SQLPLUS无法使用上下箭头
- 图片去水印工具(Teorex Inpaint) v7.1
- 【落谷1957】口算练习题题解
- java动态生成pdf含表格table和 合并两个pdf文件功能
- python爬虫的知识
- 斯坦福I2V:一个用于以图搜视频的新闻视频数据集
- 【软件应用】word数学公式插件mathtype安装
- BUU CTF刷题之旅(Web第一页)
- openstack 云主机分辨率问题
- redis集群主从配置
- 像宜家《家居指南》那样做邮件营销
- 金融时间序列分析——对收益率序列平稳化处理