题意:。。求周长并。。。

解析:参考求面积并

图借鉴自: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(扫描线求周长并)相关推荐

  1. 线段树扫描线求矩形周长详解

    线段树扫描线求矩形周长详解 原创 wucstdio 最后发布于2018-04-24 16:12:09 阅读数 841 收藏 发布于2018-04-24 16:12:09 版权声明:本文为博主原创文章, ...

  2. TZOJ 2569 Wooden Fence(凸包求周长)

    描述 Did you ever wonder what happens to your money when you deposit them to a bank account? All banks ...

  3. POJ1151基本的扫描线求面积

    题意:      给定n个矩形的对角坐标,分别是左下和右上,浮点型,求矩形覆盖的面积. 思路:       基本的线段树扫描线求面积,没有坑点,不解释了,提示一点,有的题尤其是线段树扫描线的题需要离散 ...

  4. CF1368G Shifting Dominoes(扫描线求矩阵的并集)

    CF1368G Shifting Dominoes problem solution code problem 题目链接 solution 求的是最后棋盘本质不同的个数,而本质不同等价于两个空格位置不 ...

  5. java里创建一个长方形类_定义一个长方形类,定义 求周长和面积的方法实例

    /* 定义一个长方形类,定义 求周长和面积的方法, 然后定义一个测试了Test2,进行测试. 长方形的类: 成员变量: 长,宽 成员方法: 求周长:(长+宽)*2; 求面积:长*宽 注意: impor ...

  6. 定义一个长方形类,求周长和面积--学习笔记--16

    1.变量什么时候定义为成员变量 如果这个变量是用来描述这个类的信息的,那么,该变量就应该定义为成员变量 2.变量的范围越小越好,因为能及时的被回收 3.定义一个长方形类,求周长和面积 然后定义一个Te ...

  7. 定义一个长方形类,定义 求周长和面积的方法,然后定义一个测试了Test,进行测试

    定义一个长方形类,定义 求周长和面积的方法,然后定义一个测试了Test,进行测试. import java.util.Scanner; class ChangFangXing{private int ...

  8. POJ 1389 Area of Simple Polygons(扫描线求面积)

    思路:纯纯扫描线求面积模板题,求点赞qaq. #include<iostream> #include<cstdio> #include<cstring> #incl ...

  9. 设计一个抽象类图形类,在该类中包含有至少两个抽象方法求周长和求面积,分别定义圆形类、长方形类、正方形类、三角形类来继承图形类,并实现上述两个方法

    设计一个抽象类图形类,在该类中包含有至少两个抽象方法求周长和求面积,分别定义圆形类.长方形类.正方形类.三角形类来继承图形类,并实现上述两个方法 设计抽象类 就要使用abstract关键字,抽象类中的 ...

  10. Java6面向对象编程创建一个矩形类, 求周长 面积

    package job; /** */ import java.util.Scanner; public class Space { /* 面向对象编程创建一个矩形类, 求周长 面积 */ publi ...

最新文章

  1. 显示Iframe指定位置
  2. c++中构造函数 、析构函数的作用域详解
  3. 当遇到用\来分隔字符串
  4. 演练 宠物店挑小动物 java 1615136001
  5. Facebook AI牛津提出带“轨迹注意力”的Video Transformer,在视频动作识别任务中性能SOTA!...
  6. python对csv数据提取某列的某些行_python pandas获取csv指定行 列的操作方法
  7. baacloud无法连接到_加入 Beta 版“Baacloud88” - TestFlight - Apple
  8. android 扇形统计动画,Android自定义View——扇形统计图的实现代码
  9. 解决SQLPLUS无法使用上下箭头
  10. 图片去水印工具(Teorex Inpaint) v7.1
  11. 【落谷1957】口算练习题题解
  12. java动态生成pdf含表格table和 合并两个pdf文件功能
  13. python爬虫的知识
  14. 斯坦福I2V:一个用于以图搜视频的新闻视频数据集
  15. 【软件应用】word数学公式插件mathtype安装
  16. BUU CTF刷题之旅(Web第一页)
  17. openstack 云主机分辨率问题
  18. redis集群主从配置
  19. 像宜家《家居指南》那样做邮件营销
  20. 金融时间序列分析——对收益率序列平稳化处理

热门文章

  1. Java依旧排名第一,然而变化几何?
  2. 电商实例、业务并发、网站并发及解决方法
  3. 多线程进行n皇后计算
  4. KTable的设置单元格属性
  5. 模板 - 数学 - 数论
  6. 窗口的新建移动和改变大小
  7. UVALive 6888 Ricochet Robots bfs
  8. Angularjs interceptor
  9. 月经贴:当落魄的.NET基佬遇上不可一世的JAVA派 developer
  10. SQL中JOIN和UNION区别及用法