浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html

题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1382

扫描线模板题。假设有一条直线从左往右扫过平面,那么每一单位时间内这条直线被矩形覆盖的长度的和就是矩形们的面积。而直线上被覆盖的长度只会在经过矩阵的竖边时发生变化,当我们扫到一条矩阵的左边时就在该左边所覆盖的区间上打标记表示这一段区间已经被覆盖,扫到右边时减掉。一共有\(2*n\)条边,也就一共有\(2*n-1\)个区间,每个区间的面积就是当前直线上被覆盖的长度乘以构成这个区间的两条线段的\(x\)轴差值。

我们将\(2*n\)条边按\(x\)轴坐标排序,每条线段的\(y\)轴坐标离散化,然后用线段树维护每个\(y\)轴上的区间被多少条线段覆盖了。如果区间[\(l,r\)](意思是第\(l\)条线段到第\(r+1\)条线段构成的区间)被覆盖的次数大于\(0\),那么这一段的线段被覆盖的长度就是\(y[r+1]-y[l]\),否则就由两个儿子节点更新过来。因为边都是成对出现的,所以覆盖标记不用下传。

每次直接用根节点的覆盖长度乘以两条线段的\(x\)坐标的差值累加面积即可。

时间复杂度:\(O(nlogn)\)

空间复杂度:\(O(n)\)

代码如下:

#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll; const int maxn=2e4+5; ll ans;
int n,cnt;
int tmp[maxn]; int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} struct line {
int x,st,ed,mark; line() {} line(int _x,int _st,int _ed,int _mark) {
x=_x,st=_st,ed=_ed,mark=_mark;
} bool operator<(const line &a)const {
return x<a.x;
}
}p[maxn]; struct segment_tree {
int len[maxn<<2],cnt[maxn<<2]; void updata(int p,int l,int r) {
if(cnt[p])len[p]=tmp[r+1]-tmp[l];//如果有被线段覆盖就直接加进全部长度
else if(l==r)len[p]=0;//如果是叶子节点就等于0,
else len[p]=len[p<<1]+len[p<<1|1];//否则用儿子更新
} void change(int p,int l,int r,int L,int R,int v) {
if(L<=l&&r<=R) {
cnt[p]+=v;
updata(p,l,r);//每次覆盖都需要更新
return;
}
int mid=(l+r)>>1;
if(L<=mid)change(p<<1,l,mid,L,R,v);
if(R>mid)change(p<<1|1,mid+1,r,L,R,v);
updata(p,l,r);
}
}T; int main() {
n=read();
for(int i=1;i<=n;i++) {
int x1=read(),y1=read(),x2=read(),y2=read();
tmp[(i<<1)-1]=y1,tmp[i<<1]=y2;
p[(i<<1)-1]=line(x1,y1,y2,1);
p[i<<1]=line(x2,y1,y2,-1);
}sort(p+1,p+2*n+1);sort(tmp+1,tmp+2*n+1);
cnt=unique(tmp+1,tmp+2*n+1)-tmp-1;
for(int i=1;i<=2*n;i++) {
p[i].st=lower_bound(tmp+1,tmp+cnt+1,p[i].st)-tmp;
p[i].ed=lower_bound(tmp+1,tmp+cnt+1,p[i].ed)-tmp;
}//排序和离散化
for(int i=1;i<=2*n;i++) {
ans+=1ll*T.len[1]*(p[i].x-p[i-1].x);//累加第i-1号区间的面积
T.change(1,1,cnt-1,p[i].st,p[i].ed-1,p[i].mark);//更新直线上被覆盖的长度
}printf("%lld\n",ans);
return 0;
}

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

  1. bzoj1382: [Baltic2001]Mars Maps

    Description 给出N个矩形,N<=10000.其坐标不超过10^9.求其面积并 Input 先给出一个数字N,代表有N个矩形. 接下来N行,每行四个数,代表矩形的坐标. Output ...

  2. SQL Server 2008空间数据应用系列八:基于Bing Maps(Silverlight)的空间数据存储

    原文:SQL Server 2008空间数据应用系列八:基于Bing Maps(Silverlight)的空间数据存储 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft S ...

  3. SQL Server 2008空间数据应用系列七:基于Bing Maps(Silverlight) 的空间数据展现

    原文:SQL Server 2008空间数据应用系列七:基于Bing Maps(Silverlight) 的空间数据展现 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft ...

  4. 【Silverlight】Bing Maps学习系列(八):使用Bing Maps Silverlight Control加载自己部署的Google Maps

    [Silverlight]Bing Maps学习系列(八):使用Bing Maps Silverlight Control加载自己部署的Google Maps 上个月微软必应地图(Bing Maps) ...

  5. 【Silverlight】Bing Maps学习系列(七):使用Bing Maps的图片系统(Tile System)

    [Silverlight]Bing Maps学习系列(七):使用Bing Maps的图片系统(Tile System) 目前包括微软必应地图在内的几乎所有在线电子地图(如:Google Maps等)都 ...

  6. 【Silverlight】Bing Maps学习系列(二):通过Bing Maps Silverlight Control如何显示地图(转)

    [Silverlight]Bing Maps学习系列(二):通过Bing Maps Silverlight Control如何显示地图 如本系列第一篇你所介绍的,开发基于Silverlight的Bin ...

  7. Bing Maps进阶系列八:在Bing Maps中集成OpenStreetMap地图

    Bing Maps进阶系列八:在Bing Maps中集成OpenStreetMap地图 OSM(OpenStreetMap-开放街道地图)服务就是一种发布自己地图数据图片为服务的一种实现类型,开放街道 ...

  8. Bing Maps进阶系列一:初识Bing Maps地图服务

    Bing Maps进阶系列一:初识Bing Maps地图服务 Bing Maps提供了一组WCF的地图服务,使用这些服务我们可以方便的在自己的应用系统里实现地理位置搜索等相关功能.他们分别是地理编码服 ...

  9. [BZOJ1382]Mars Maps

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

随机推荐

  1. SQL Prompt 编辑

    SQL Prompt是一款拥有SQL智能提示功能的SQL Server和VS插件.超级好用的插件,

  2. java和erlang之间的DES加解密

    app登录,登录的密码要用DES加密,服务器是用erlang,客户端要同时支持多平台(Android.iOS).首先,Java端的DES加密的实现方式, 少说废话了,直接上代码,如下: public ...

  3. iOS判断为空或者只为空格

    本文转载至 :http://www.cnblogs.com/superhappy/archive/2012/11/08/2761403.html 经常有需求 要判断不能为空,后台老是鄙视不做非空判断的 ...

  4. PHP数据类型转换和运算符表达式

    一:数据类型的转换 获取类型: gettype($a); 判断是否是某种类型的数据: is_类型名($a); 1.(int)$a; 2.settype($a,int); 二:运算符表达式 1.数学运算 ...

  5. MongoDB的对象的创建

    package com.voice.db; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.Mon ...

  6. 九度OJ 1070:今年的第几天? (日期计算)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4833 解决:2716 题目描述: 输入年.月.日,计算该天是本年的第几天. 输入: 包括三个整数年(1<=Y<=3000).月 ...

  7. java常用的基础容器

    1 Vector and ArrayList 它们都是可以随机访问的.它们的区别是Vector是线程安全的,而ArrayList不是线程安全的. 2 HashMap的底层实现机制 2.1 底层数据结构 ...

  8. git学习------>"Agent admitted failure to sign using the key." 问题解决方法

    今天用git clone 命令clone服务器上的代码时候报了如下的错误: ouyangpeng@oyp-ubuntu:~/Android/git_canplay_code$ git clone gi ...

  9. (转)php 根据url自动生成缩略图并处理高并发问题

    分享是一种精神,与技术高低无关!   图片缩略图动态生成- [代码编程] 2011-08-23 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://www.blogbus.c ...

  10. Node.js学习笔记(2):基本模块

    Node.js学习笔记(2):基本模块 模块 引入模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在No ...