[矩形并-掃描線-線段樹]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.pswp.cn/news/284440.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284440.shtml
英文地址,請注明出處:http://en.pswp.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…