[矩形并-扫描线-线段树]Picture

最近在补数学和几何,没啥好写的,因为已经决定每天至少写一篇了,今天随便拿个题水水。

 

题目大意:给你N个边平行于坐标轴的矩形,求它们并的周长。(N<=5000)

思路:这个数据范围瞎暴力就过了,但我们是有文化的人,下面讲讲利用扫描线和线段树的简单O(NlogN)做法。

先讲扫描线。我们先只考虑横着的边,竖着的等会儿一样做就是了。我们假设有一条横着的直线(这条就是扫描线啦)从所有矩形的上方扫到所有矩形的下方,我们时刻维护这条线上各个位置分别被几个矩形覆盖,一开始肯定都是0,如果碰到一个矩形上方的边,我们先查看这条边上哪些部分还未被其他矩形覆盖,计入答案,然后把扫描线上的这一整条边的被覆盖次数加一;如果遇到一个矩形下方的边,同理我们先把扫描线上这一部分的被覆盖次数减一,看看那些部分已经未被其他矩形覆盖了(即被当前边最后覆盖),再计入答案,扫一遍所有矩形,就算完了。实现上我们可以把所有横的边拿出来,记下纵坐标和左右端点,以及是矩形上方还是下方的边,然后按纵坐标排个序就可以处理了。

那么如何维护呢?我们只要支持区间加减以及查询区间内0的个数,看上去线段树就能做,区间加减都是小Case,问题是如何查区间内0的个数?在区间加减的同时似乎不是很好维护。其实很简单,我们只要维护区间最小值和最小值个数就可以了,由我们维护的信息的意义可知,这些信息的最小值不会小于0,如果有0,查询最小值及个数时一定能被我们找到,维护最小值区间加减也很容易。网络上看见有人O(n)暴力维护的,还有线段树维护很多信息来计算的,感觉都不是很好,更有甚者在线段树上每次O(n)暴力维护,看了令人汗颜……

#include<cstdio>
#include<algorithm>
using namespace std;
#define MN 10000
#define MX 20000
#define L (k<<1)
#define R ((k<<1)+1)
struct work{int x,l,r,p;}x[MN+5],y[MN+5];
bool cmp(work a,work b){return a.x==b.x?a.p>b.p:a.x<b.x;}
struct data{int x,s;};
data operator+(data a,data b)
{if(a.x==b.x)return(data){a.x,a.s+b.s};return a.x<b.x?a:b;
}
struct node{int l,r,mk;data x;}t[MX*4+5];
inline void up(int k){t[k].x=t[L].x+t[R].x;}
inline void add(int k,int x){t[k].x.x+=x;t[k].mk+=x;}
inline void down(int k){if(t[k].mk)add(L,t[k].mk),add(R,t[k].mk),t[k].mk=0;}
void build(int k,int l,int r)
{t[k].l=l;t[k].r=r;if(l==r){t[k].x.s=1;return;}int mid=l+r>>1;build(L,l,mid);build(R,mid+1,r);up(k);
}
void renew(int k,int l,int r,int x)
{if(t[k].l==l&&t[k].r==r){add(k,x);return;}down(k);int mid=t[k].l+t[k].r>>1;if(r<=mid)renew(L,l,r,x);else if(l>mid)renew(R,l,r,x);else renew(L,l,mid,x),renew(R,mid+1,r,x);up(k);
}
data query(int k,int l,int r)
{if(t[k].l==l&&t[k].r==r)return t[k].x;down(k);int mid=t[k].l+t[k].r>>1;if(r<=mid)return query(L,l,r);if(l>mid)return query(R,l,r);return query(L,l,mid)+query(R,mid+1,r);
}
int n,ans;
void solve(work*x)
{for(int i=0;i<n;++i){if(x[i].p<0)renew(1,x[i].l,x[i].r,-1);data d=query(1,x[i].l,x[i].r);if(x[i].p>0)renew(1,x[i].l,x[i].r,1);ans+=d.x?0:d.s;}
}
int main()
{int i,x0,y0,x1,y1;scanf("%d",&n);for(i=0;i<n;++i){scanf("%d%d%d%d",&x0,&y0,&x1,&y1);x0+=MN;y0+=MN;x1+=MN;y1+=MN;x[i]=(work){y0,x0,x1-1,1};x[i+n]=(work){y1,x0,x1-1,-1};y[i]=(work){x0,y0,y1-1,1};y[i+n]=(work){x1,y0,y1-1,-1};}n<<=1;sort(x,x+n,cmp);sort(y,y+n,cmp);build(1,0,MX);solve(x);solve(y);printf("%d",ans);
}

 

转载于:https://www.cnblogs.com/ditoly/p/Rectangle-Union.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/284440.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

聊聊研发团队中的“人”

大家好&#xff0c;我是Z哥。汉字博大精深&#xff0c;很多时候我们可以通过拆字来更形象地理解一个词的含义。比如“团队”这个词的两个字"团"和“队”单独看也都是表示一种由多人组成的组织。再做一下拆字就是“口”“才”和“耳”“人”。前者表示一个人才如果没有…

[转]【分布式系统】唯一ID生成策略总结

文章目录 全局唯一id介绍 全局唯一id特点:常见全局唯一id生成策略 1、数据库自增长序列或字段生成id 2、UUID 3、Redis生成ID 4、zookeeper生成ID 5、Twitter的snowflake算法全局唯一id介绍 系统唯一id是我们在设计阶段常常遇到的问题。在复杂的分布式系统中&#…

shell在一个大文件找出想要的一段字符串操作技巧

昨天端午&#xff0c;晚上的时候接了一个电话&#xff0c;我朋友的公司&#xff0c;数据库被两个工作没多久的phper给弄坏了&#xff0c;具体就是把一个字段值&#xff0c;给全表弄成一个了名字了&#xff0c;当然这个是可以配置了禁止全表更新数据库,这下可急坏了&#xff0c;…

CentOS7安装EPEL源

CentOS7安装EPEL [lijiayuncentos-*** ~]$ yum install epel-release已加载插件&#xff1a;fastestmirror, langpacks您需要 root 权限执行此命令。[lijiayuncentos-*** ~]$ su密码&#xff1a;[rootcentos-*** lijiayun]# yum install epel-release已加载插件&#xff1a;fas…

超全的开源Winform UI库,满足你的一切桌面开发需求!

本文有dotnet9站长整理 网址&#xff1a;https://dotnet9.com/本站曾介绍过一款Winform开源控件库HZHControls&#xff0c;Winform在大家心中的地位还是挺高的&#xff0c;今天小编再分享一款新鲜出炉的 Winform UI库——SunnyUI&#xff0c;一起跟 Dotnet9 往下看吧。项目名称…

告别国外 IDE,阿里 蚂蚁自研 IDE 研发框架 OpenSumi 正式开源

经历近 3 年时间&#xff0c;在阿里集团及蚂蚁集团共建小组的努力下&#xff0c;OpenSumi 作为国内首个强定制性、高性能&#xff0c;兼容 VS Code 插件体系的 IDE 研发框架&#xff0c;今天正式对外开源。 一 OpenSumi 是什么&#xff1f; OpenSumi 是一款面向垂直领域&#…

window-memcache技术随笔

memcached.exe软件放置到非中文,非空格的目录,把MSVCR71.DLL文件放在memcached.exe同目录下启动,控制面板中打开window功能-Telnet客户端memcache服务方法一:管理员身份打开黑窗口 d:(mem的所在盘)cd memmemcached.exe -p 11211方法二: 安装为Windows的系统服务memcached.exe -…

将不确定变为确定~老赵写的CodeTimer是代码性能测试的利器

首先&#xff0c;非常感谢赵老大的CodeTimer&#xff0c;它让我们更好的了解到代码执行的性能&#xff0c;从而可以让我们从性能的角度来考虑问题&#xff0c;有些东西可能我们认为是这样的&#xff0c;但经理测试并非如何&#xff0c;这正应了我之前的那名话&#xff1a;“机器…

聊聊 C++ 中的几种智能指针(下)

一&#xff1a;背景 上一篇我们聊到了C 的 auto_ptr &#xff0c;有朋友说已经在 C 17 中被弃用了&#xff0c;感谢朋友提醒&#xff0c;今天我们来聊一下 C 11 中引入的几个智能指针。unique_ptrshared_ptrweak_ptr看看它们都怎么玩。二&#xff1a;三大智能指针详解 1. uniq…

iOS回顾笔记( 02 ) -- 由九宫格布局引发的一系列“惨案”

iOS回顾笔记&#xff08; 02 &#xff09; -- 由九宫格布局引发的一系列“惨案” 前言&#xff08;扯几句淡先&#xff09; 回顾到学习UI过程中的九宫格布局时&#xff0c;发现当时学的东西真是不少。 这个阶段最大的特点就是&#xff1a;知识点繁多且琐碎。 我们的目标就是要将…

【GlobalMapper精品教程】007:如何加载谷歌卫星影像?

“Global Mapper支持所有OGC标准数据源类型,例如用于流式栅格地图的WMS / WMTS,用于矢量数据集的WFS和用于为指定区域下载单个数据文件的WCS。预先切片的图像和地形数据集也可以使用OSM(OpenStreetMaps)、TMS(Tiled Map Service)和Google Maps瓦片架构支持。您只需要选择适当…

LVS/keepalived配置

LVS/DR keepalived配置注意&#xff1a;前面虽然我们已经配置过一些操作&#xff0c;但是下面我们使用keepaliave操作和之前的操作是有些冲突的&#xff0c;所以若是之前配置过DR&#xff0c;请首先做如下操作&#xff1a;dr上执行&#xff1a;$ipv -Cifconfig eth0:0 down前…

Mysql清空表(truncate)与删除表中数据(delete)的区别

2019独角兽企业重金招聘Python工程师标准>>> 为某基于wordpress搭建的博客长久未除草&#xff0c;某天升级的时候发现已经被插入了几万条垃圾留言&#xff0c;如果一条条删除那可真是累人的活。遂考虑直接进入mysql直接清空表或者删除表中数据。 本文记录一下这2种操…

[转]云原生到底是什么?

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#x1f61c; &#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525; &#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4ac;格言&#xf…

【GlobalMapper精品教程】008:如何根据指定区域(shp、kml、cad)下载卫星影像?

本文讲解在Globalmapper中根据指定的范围(shp、kml、cad等格式)进行在线卫星影像的下载方法。 文章目录 一、根据shp范围下载谷歌影像1. 加载谷歌影像2. 加载shp矢量范围3. 根据范围导出影像二、根据kml范围下载谷歌影像1. 生成研究区范围kml2. 根据kml范围下载影像三、根据CAD…

膛目结舌的代码技巧!一看就是冷暴力~~~~

你见过哪些令你膛目结舌的代码技巧&#xff1f; 代码世界有很多令人大呼小叫的技巧&#xff01;有的代码像魔术师一样巧妙地隐藏了自己&#xff0c;有的像魔法师一样让你眼花缭乱&#xff0c;还有的像瑜伽大师一样灵活自如。它们让我们惊叹不已&#xff0c;让我们觉得自己仿佛置…

联合线程

联合线程实际上就是把多线程又联合成了一个线程&#xff0c;但这里还是要比单线程灵活很多&#xff0c;比如说&#xff0c;我可以让一个线程到运行到某一个条件再联合其他线程。当前线程与其他线程联合在一起&#xff0c;又一种让出cpu&#xff0c;而且直到别个线程运行完&…

Kafka学习征途:不再依赖ZK的KRaft

【Kafka】| 总结/Edison Zhou1新的KRaft架构在Kafka 2.8之前&#xff0c;Kafka重度依赖于Zookeeper集群做元数据管理和集群的高可用&#xff08;即所谓的共识服务&#xff09;。在Kafka 2.8之后&#xff0c;引入了基于Raft协议的KRaft模式&#xff0c;支持取消对Zookeeper的依赖…

探索java世界中的日志奥秘

java日志简单介绍 对于一个应用程序来说日志记录是必不可少的一部分。线上问题追踪&#xff0c;基于日志的业务逻辑统计分析等都离不日志。JAVA领域存在多种日志框架&#xff0c;目前常用的日志框架包括Log4j&#xff0c;Log4j 2&#xff0c;Commons Logging&#xff0c;Slf4j&…

nginx的负载均衡集群

针对域名:vim /usr/local/nginx/conf/vhosts/lb.conf //自定义名称upstream xrc { //别名server 192.168.0.1:80 weight2; //包含的主机server,负载均衡里面的机器server 192.168.0.2:80 weight1; //权重weight}server {li…