【luoguP5490】【模板】扫描线
求\(n\)个矩形的面积并,可以用线段树维护一条垂直于\(y\)轴的直线上被矩形覆盖的长度有多少长,将直线从左往右扫一遍,遇到矩形左边界就+1,遇到右边界就-1,不为\(0\)的位置就表示没有覆盖

不为\(0\)的位置的多少似乎不好维护,
考虑这样一个性质:
如果一个线段树上的区间在扫过一个矩形的左边界被全部覆盖,那么在这个扫过矩形的右边界之前它都是全部被覆盖着的,并且我们每次询问都是询问[1,n]
我们可以在线段树上记录一个\(cnt\)表示一个区间被几个矩形完全覆盖了,如果cnt!=0,那么这个区间的\(ans=r-l\),这样就不需要标记下传了
如果cnt==0,那么用左儿子的ans加上右儿子的ans就可以了
注意线段树左右合并时中间的长度没有计算,所以要用[l,r]的线段树结点维护[l,r+1]的区间
因为数据范围较大,需要离散化
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
#define lc p<<1
#define rc p<<1|1
#define mid ((l+r)>>1)
using namespace std;
const int MAXN=100010;
inline int read(){
int x=0; char c=getchar();
while(c<'0') c=getchar();
while(c>='0') x=x*10+c-'0',c=getchar();
return x;
}
struct Matrix{
int x1_,x2_,y1_,y2_;
} a[MAXN];
int n,xx[MAXN<<1],cnt;
int revx[MAXN<<1];
long long Ans;
map<int,int> mx;
struct Upd{
int yid,l,r,k;
} u[MAXN<<1];
inline bool cmp(Upd p,Upd q){
return p.yid<q.yid;
}
int len[MAXN<<4],Cnt[MAXN<<4],numx;
inline void push_up(int p,int l,int r){
if(Cnt[p]){
len[p]=revx[r+1]-revx[l];
if(l!=r)
cout<<len[p]<<' '<<len[lc]+len[rc]<<' '<<Cnt[lc]<<' '<<Cnt[rc]<<endl;
}
else len[p]=len[lc]+len[rc];
}
inline void update(int L,int R,int d,int p=1,int l=1,int r=numx){
if(L<=l&&r<=R){
Cnt[p]+=d;
push_up(p,l,r);
return;
}
if(L<=mid) update(L,R,d,lc,l,mid);
if(R>mid) update(L,R,d,rc,mid+1,r);
push_up(p,l,r);
}
signed main()
{
n=read();
for(int i=1;i<=n;++i){
a[i].x1_=read(),a[i].y1_=read();
a[i].x2_=read(),a[i].y2_=read();
xx[++cnt]=a[i].x1_;
xx[++cnt]=a[i].x2_;
}
sort(xx+1,xx+1+cnt);
for(int i=1;i<=cnt;++i)
if(xx[i]!=xx[i-1])
mx[xx[i]]=++numx,revx[numx]=xx[i];
int unum=0;
for(int i=1;i<=n;++i){
u[++unum].yid=a[i].y1_;
u[unum].l=a[i].x1_;
u[unum].r=a[i].x2_;
u[unum].k=1;
u[++unum].yid=a[i].y2_;
u[unum].l=a[i].x1_;
u[unum].r=a[i].x2_;
u[unum].k=-1;
}
sort(u+1,u+1+unum,cmp);
for(int i=1;i<=unum;++i){
if(i>1&&u[i].yid!=u[i-1].yid){
Ans+=1ll*len[1]*(u[i].yid-u[i-1].yid);
}
update(mx[u[i].l],mx[u[i].r]-1,u[i].k);
}
printf("%lld\n",Ans);
return 0;
}
【luoguP5490】【模板】扫描线的更多相关文章
- 线段树基础模板&&扫描线
线段树的单点更新+区间求和 hdu1166敌兵布阵 Input 第一行一个整数T,表示有T组数据. 每组数据第一行一个正整数N(N<=),表示敌人有N个工兵营地 ,接下来有N个正整数,第i个正整 ...
- Atitit 路径规划法attilax总结 扫描线路法
Atitit 路径规划法attilax总结 扫描线路法 2017/2/8 20:43:37[吐槽]深圳-小 2017/2/8 20:43:37 群主做什么的2017/2/10 10:03:15系统消 ...
- 矩形面积并-扫描线 线段树 离散化 模板-poj1151 hdu1542
今天刚看到这个模板我是懵逼的,这个线段树既没有建树,也没有查询,只有一个update,而且区间成段更新也没有lazy标记....研究了一下午,我突然我发现我以前根本不懂扫描线,之所以没有lazy标记, ...
- 覆盖的面积 HDU - 1255 (线段树-扫描线)模板提
给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. Input输入数据的第一行是一个正整数T(1<=T<=100),代表测试数据的数量.每个测试数据的第一行是一个正整数N(1& ...
- HDU 1542.Atlantis-线段树求矩形面积并(离散化、扫描线/线段树)-贴模板
好久没写过博客了,这学期不是很有热情去写博客,写过的题也懒得写题解.现在来水一水博客,写一下若干年前的题目的题解. Atlantis Time Limit: 2000/1000 MS (Java/Ot ...
- LA 4127 - The Sky is the Limit (离散化 扫描线 几何模板)
题目链接 非原创 原创地址:http://blog.csdn.net/jingqi814/article/details/26117241 题意:输入n座山的信息(山的横坐标,高度,山底宽度),计算他 ...
- HDU1828 Picture 线段树+扫描线模板题
Picture Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- [P5490] 【模板】扫描线 - 线段树
求 \(n\) 个矩形的面积并 Solution 将矩形转化为 \(y_1\) 位置的 + 修改 和 \(y_2\) 位置的 - 修改.然后按照 \(+y\) 顺序依次处理所有的修改,到达的一个新的位 ...
- HDU 1542 线段树+扫描线+离散化
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
随机推荐
- Kafka学习笔记之Kafka日志删出策略
0x00 概述 kafka将topic分成不同的partitions,每个partition的日志分成不同的segments,最后以segment为单位将陈旧的日志从文件系统删除. 假设kafka的在 ...
- j.u.c: Java并发包的5大块
//TODO Executors: ExecutorService executor = Executors.newFixedThreadPool(10);... newForkJoinPool(). ...
- react 使用的小建议
使用pureRender,setState和Immutable.js来操作state Immutable 中文意思不可变. 不能直接修改state的值,要用setState 和Immutable re ...
- 【JVM】G1垃圾收集器深入分析
一.和CMS对比 G1 CMS 设计原则 首先收集尽可能多的垃圾(Garbage First) 尽可能少而块地执行GC,以停顿时间为目标 垃圾回收时机 启发式算法,在老年代找出具有高收集收益的分 ...
- Javascript数组原型方法大全以及实例!!
数组的方法有数组原型方法,也有从object对象继承来的方法,这里我们只介绍数组的原型方法,数组原型方法主要有以下这些: join() push()和pop() shift() 和 unshift() ...
- XSS挑战之旅---游戏通关攻略
最近发现一个有趣的XSS闯关小游戏,游戏的作者是先知社区的大佬Mramydnei,喜欢XSS的大家可以一起来学习交流. 现在我把自己在前面的十八关里面的闯关过程记录一下,大神绕行,我是菜鸟,大家可以一 ...
- vue + yarn 项目开发 (一)
1.打开src文件夹中的main.js文件,添加引用element ui框架 import ElementUI from 'element-ui' import 'element-ui/lib/the ...
- HTML5 表单新增内容
一.H5 新增控件 1.datalist 元素 datalist 标签定义选项列表,请与 input 元素配合使用该元素.可为输入框提供一个可选的列表,可以直接选择列表项,也可以不选择列表中的项,自行 ...
- FreeRTOS 任务通知模拟消息邮箱
举例 void task1_task(void *pvParameters) { u8 key; BaseType_t err; while(1) { key=KEY_Scan(0); //扫描按键 ...
- CRM ORDER SEARCH增强查询条件(已有字段)
ORDER_H表增强的两个字段,很早了,非AET,非EEWB,所以也加不到标准的搜索界面. GENIL_MODEL_BROWSER找到对应的查询和结果结构,append进字段:ZZZBRAND. 然后 ...