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. KVO的简单用法

    KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知.简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了 ...

  2. #include #import @class 的一些用法区别

    从网上查了一些资料,整理了一下,发现很多都说的比较详尽,下面摘录自网络 说一下#import同class之间的区别 在ios中我们经常会在.h和.m中引入一些类啊等等一般用的是#import来进行声明 ...

  3. Java-->在txt文件每一行前加行数和冒号

    --> 这里是添加后复制到另一个文件,对同一文件的操作下次进行... package com.dragon.java.addtotxt; import java.io.BufferedReade ...

  4. 修饰符(static、final、abstract)第一篇

    三个修饰符: 一.static: 作用域: 1. 属性 1.1 静态属性不必要创建新对象,可直接用类调用 1.2 其值发生改变,则类中的值也会随之而变并延伸到其他对象中 例子: class Anima ...

  5. smartUpload组件批量下载

    public class BatchDownloadServlet extends HttpServlet { public void doGet(HttpServletRequest request ...

  6. C++程序结构---1

    C++ 基础教程Beta 版 原作:Juan Soulié 翻译:Jing Xu (aqua) 英文原版 本教程根据Juan Soulie的英文版C++教程翻译并改编. 本版为最新校对版,尚未定稿.如 ...

  7. HDU 5234 Happy birthday --- 三维01背包

    HDU 5234 题目大意:给定n,m,k,以及n*m(n行m列)个数,k为背包容量,从(1,1)开始只能往下走或往右走,求到达(m,n)时能获得的最大价值 解题思路:dp[i][j][k]表示在位置 ...

  8. HDU 1087 Super Jumping! Jumping! Jumping

    HDU 1087 题目大意:给定一个序列,只能走比当前位置大的位置,不可回头,求能得到的和的最大值.(其实就是求最大上升(可不连续)子序列和) 解题思路:可以定义状态dp[i]表示以a[i]为结尾的上 ...

  9. Machine and Deep Learning with Python

    Machine and Deep Learning with Python Education Tutorials and courses Supervised learning superstiti ...

  10. EDIUS设置自定义输出的方法

    在做后期视频剪辑时,往往根据需求,需要输出不同分辨率格式的视频文件,那在EDIUS中,如何自定义输出设置,使之符合自己的需要呢?下面小编就来详细讲讲EDIUS自定义输出的一二事吧. 当剪辑完影片,设置 ...