P5490 【模板】扫描线
时间:2019-10-26
本文章向大家介绍P5490 【模板】扫描线,主要包括P5490 【模板】扫描线使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
注意点:
- 线段树中使用获取具体长度时右端点应当+1,向线段树内插入值时右端点应当-1.(区间覆盖线段树)
#include<cstdio> #include<iostream> #include<algorithm> #define ll long long using namespace std; const int MAXN=2e6+50; struct Line{ ll x1,x2; ll y; bool type;//0:出现 1:删除 bool operator <(Line another)const{ return y<another.y; } }lines[MAXN]; int lineCnt=0; void addLine(ll x1,ll x2,ll y,bool type){ lines[++lineCnt].x1=x1; lines[lineCnt].x2=x2; lines[lineCnt].y=y; lines[lineCnt].type=type; } struct Node{ int l,r; ll len,cnt;//长度 覆盖次数 }tr[MAXN*4]; int root=1; void build(int p,int l,int r){ tr[p].l=l,tr[p].r=r; if(l==r)return; int mid=(l+r)>>1; build(p<<1,l,mid); build((p<<1)|1,mid+1,r); } ll a[MAXN];//离散化后的x坐标 void pushup(int p){ if(tr[p].cnt){ tr[p].len=a[tr[p].r+1]-a[tr[p].l]; }else{ tr[p].len=tr[p<<1].len+tr[(p<<1)|1].len; } } void change(int p,int l,int r,int val){ if(tr[p].l>=l&&tr[p].r<=r){ tr[p].cnt+=val; pushup(p); return; } int mid=(tr[p].l+tr[p].r)>>1; if(l<=mid)change(p<<1,l,r,val); if(r>mid)change((p<<1)|1,l,r,val); pushup(p); } int main(){ int n; scanf("%d",&n); for(int i=1;i<=n;i++){ int x1,y1,x2,y2; cin>>x1>>y1>>x2>>y2; a[i]=x1,a[i+n]=x2; addLine(x1,x2,y1,0); addLine(x1,x2,y2,1); } sort(a+1,a+2*n+1); int cnt=unique(a+1,a+2*n+1)-a-1;//离散化 build(root,1,cnt-1); sort(lines+1,lines+lineCnt+1); ll ans=0; for(int i=1;i<=lineCnt;i++){ Line nowLine=lines[i]; if(i>1){ ans+=tr[root].len*(nowLine.y-lines[i-1].y); } if(nowLine.type==0){//增加 change(root,lower_bound(a+1,a+cnt+1,nowLine.x1)-a,lower_bound(a+1,a+cnt+1,nowLine.x2)-a-1,1); }else if(nowLine.type==1){//减少 change(root,lower_bound(a+1,a+cnt+1,nowLine.x1)-a,lower_bound(a+1,a+cnt+1,nowLine.x2)-a-1,-1); } } cout<<ans<<endl; return 0; }
原文地址:https://www.cnblogs.com/zbsy-wwx/p/11745561.html
- python爬虫反爬取---设置IP代理自动变换requests.get()中proxy的IP
- 【译】TensorFlow实现Batch Normalization
- 关于Python语言规范你需要知道的一些小tips
- R语言可视化——REmap(路径图)
- python面向对象
- 字符串hash入门
- R语言数据处理——数据合并与追加
- python爬取链家租房之获取房屋页面的详细信息(房名,地址,房价,面积,url)
- 信用卡“坏账”客户分析(二)
- Mac上提升python运算速度-PyPy初体验
- python处理json数据(复杂的json转化成嵌套字典并处理)
- Pointer-network理论及tensorflow实战
- python3 log文件处理获取某天需要的数据
- 实战深度强化学习DQN-理论和实践
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 如何验证python安装成功
- python三引号如何输入
- Python定义一个函数的方法
- keras 模型参数,模型保存,中间结果输出操作
- python判断是空的实例分享
- keras绘制acc和loss曲线图实例
- 基于Python实现2种反转链表方法代码实例
- Python smtp邮件发送模块用法教程
- Python3基于print打印带颜色字符串
- Python StringIO及BytesIO包使用方法解析
- PHP设计模式之PHP迭代器模式讲解
- 简单实用的PHP文本缓存类实例
- Keras 实现加载预训练模型并冻结网络的层
- Django-imagekit的使用详解
- Python类super()及私有属性原理解析