Description

给出N个矩形,N<=10000.其坐标不超过10^9.求其面积并

Input

先给出一个数字N,代表有N个矩形. 接下来N行,每行四个数,代表矩形的坐标.

Output

输出面积并
经典的线段树维护扫描线
令扫描线平行于y轴沿x轴正方向移动,线段树维护扫描线上被矩形覆盖的长度(实际维护的是当前扫描线上被矩形覆盖层数最少的层数和相应的长度,即维护区间+-1和区间最小值和区间最小值个数)
#include<cstdio>
#include<algorithm>
typedef long long i64;
char buf[],*ptr=buf-;
int _(){
int x=,f=,c=*++ptr;
while(c<)c=='-'&&(f=-),c=*++ptr;
while(c>)x=x*+c-,c=*++ptr;
return x*f;
}
int n,_L,_R,A;
int rs[][];
struct node{
node*l,*r;
int mn,mc,av;
void dn(){
if(!av)return;
l->mn+=av;
l->av+=av;
r->mn+=av;
r->av+=av;
av=;
}
void up(){
mn=l->mn;
mc=l->mc;
if(mn>r->mn)mn=r->mn,mc=r->mc;
else if(mn==r->mn)mc+=r->mc;
}
void inc(int L,int R){
if(_L<=L&&R<=_R){
mn+=A;
av+=A;
return;
}
dn();
int M=L+R>>;
if(_L<=M)l->inc(L,M);
if(_R>M)r->inc(M+,R);
up();
}
}ns[],*np=ns,*rt;
int ys[],yp=;
node*build(int L,int R){
node*w=np++;
w->mc=ys[R+]-ys[L];
if(L!=R){
int M=L+R>>;
w->l=build(L,M);
w->r=build(M+,R);
}
return w;
}
struct event{
int x,y1,y2,t;
}e[],*ep=e;
bool operator<(const event&a,const event&b){
return a.x<b.x;
}
int main(){
fread(buf,,,stdin);
n=_();
for(int i=;i<n;++i){
for(int j=;j<;++j)rs[i][j]=_();
ys[yp++]=rs[i][];
ys[yp++]=rs[i][];
}
std::sort(ys,ys+yp);
yp=std::unique(ys,ys+yp)-ys;
for(int i=;i<n;++i){
rs[i][]=std::lower_bound(ys,ys+yp,rs[i][])-ys;
rs[i][]=std::lower_bound(ys,ys+yp,rs[i][])-ys-;
*(ep++)=(event){rs[i][],rs[i][],rs[i][],};
*(ep++)=(event){rs[i][],rs[i][],rs[i][],-};
}
rt=build(,yp-);
std::sort(e,ep);
ep->x=0x7fffffff;
int px=e->x,h=ys[yp-]-ys[];
i64 ans=;
for(event*p1=e,*p2=e;p1!=ep;p1=p2){
ans+=i64(p1->x-px)*(h-(rt->mn?:rt->mc));
px=p1->x;
while(p1->x==p2->x)++p2;
while(p1!=p2){
_L=p1->y1,_R=p1->y2,A=p1->t;
if(_L<=_R)rt->inc(,yp-);
++p1;
}
}
printf("%lld",ans);
return ;
}

bzoj1382: [Baltic2001]Mars Maps的更多相关文章

  1. BZOJ1382:[Baltic2001]Mars Maps

    浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html 题目传送门:https://www.lydsy.com/JudgeOnline/prob ...

  2. [BZOJ1382]Mars Maps

    Description In the year 2051, several Mars expeditions have explored different areas of the red plan ...

  3. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  4. [IOI1998]Picture

    Description 在一个平面上放置一些矩形,所有的边都为垂直或水平.每个矩形可以被其它矩形部分或完全遮盖,所有矩形合并成区域的边界周长称为轮廓周长. 要求:计算轮廓周长. 数据规模: 0≤矩形数 ...

  5. How to Tell Science Stories with Maps

    Reported Features How to Tell Science Stories with Maps August 25, 2015   Greg Miller This map, part ...

  6. 【腾讯Bugly干货分享】微信终端跨平台组件 Mars 系列 - 我们如约而至

    导语 昨天上午,微信在广州举办了微信公开课Pro.于是,精神哥这两天的朋友圈被小龙的"八不做"刷屏了.小伙伴们可能不知道,下午,微信公开课专门开设了技术分论坛.在分论坛中,微信开源 ...

  7. 【腾讯Bugly干货分享】微信终端跨平台组件 mars 系列(二) - 信令传输超时设计

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/9DJxipJaaBC8yC-buHgnTQ 作者简介: ...

  8. 如约而至:微信自用的移动端IM网络层跨平台组件库Mars已正式开源

    1.前言 关于微信内部正在使用的网络层封装库Mars开源的消息,1个多月前就已满天飞(参见<微信Mars:微信内部正在使用的网络层封装库,即将开源>),不过微信团队没有失约,微信Mars ...

  9. 检索Google Maps地图位置(小训练)

    名称:检索地图位置 内容:地图初期显示和检索显示 功能:根据条件检索地图的经度与纬度 1.在这之前我们需要创建一个表(Accoun__c),添加一个重要的字段地理位置情報,它会默认的给你两个字段经度和 ...

随机推荐

  1. sass中mixin常用的CSS3

    圆角border-radius @mixin rounded($radius){ -webkit-border-radius: $radius; -moz-border-radius: $radius ...

  2. 转载:LBP代码详细注释

    %LBP returns the local binary pattern image or LBP histogram of an image.% J = LBP(I,R,N,MAPPING,MOD ...

  3. 383. Ransom Note

    
Given
 an 
arbitrary
 ransom
 note
 string 
and 
another 
string 
containing 
letters from
 all 
th ...

  4. 66. Plus One

    Given a non-negative number represented as an array of digits, plus one to the number. The digits ar ...

  5. 143. Reorder List

    Given a singly linked list L: L0→L1→…→Ln-1→Ln,reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You must do thi ...

  6. xctest错误问题解决

    xctest xctest.h file not found(null): Framework not found XCTest 在FrameWork Search Path里增加以下内容$(PLAT ...

  7. jquery中prop()方法和attr()方法的区别

    最近在用jquery的时候遇到一个问题,那就是attr()方法,发现这个方法有时候使用会有一些说不出原因的问题.翻翻自己之前笔记发现,还有个函数prop(). 这两个函数都可以用来获取属性. jque ...

  8. JS从头开始

    API:应用程序编程接口 HTML:超文本标记语言 XML:可扩展标记语言 HTML和XML的差别:设计目的不同:XML被设计用来传输和存储数据,其焦点在数据的内容:HTML被设计用来显示数据,其焦点 ...

  9. C++ Primer : 第十二章 : 动态内存之shared_ptr类

    在C++中,动态内存是的管理是通过一对运算符来完成的:new  ,在动态内存中为对象分配空间并返回一个指向该对象的指针,delete接受一个动态对象的指针,销毁该对象,并释放该对象关联的内存. 动态内 ...

  10. scala言语基础学习十二