POJ 1151 线段树+扫描线
2024-09-05 21:49:04
题意:求矩形面积的并
思路:
注意是[l,mid][mid,r] 这是真正的线段了
就当扫描线模板使吧~
//By SiriusRen
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define eps 1e-5
int N,tot,n,cases;
double y[666],ans=0;
struct Node{double x,y1,y2;int cover;}node[666];
struct Tree{double l,r,len;int cover;}tree[66666];
bool cmp(Node a,Node b){return a.x<b.x;}
void build(int l,int r,int pos){
tree[pos].l=y[l],tree[pos].r=y[r],tree[pos].len=tree[pos].cover=0;
if(l+1==r)return;
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
build(l,mid,lson),build(mid,r,rson);
}
void push_up(int l,int r,int pos){
if(tree[pos].cover>0)
tree[pos].len=tree[pos].r-tree[pos].l;
else if(l+1==r)tree[pos].len=0;
else tree[pos].len=tree[pos<<1].len+tree[pos<<1|1].len;
}
void update(int l,int r,int pos,Node jy){
if(tree[pos].l>=jy.y1&&tree[pos].r<=jy.y2){
tree[pos].cover+=jy.cover;push_up(l,r,pos);
return;
}
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
if(tree[lson].r>=jy.y2)update(l,mid,lson,jy);
else if(tree[rson].l<=jy.y1)update(mid,r,rson,jy);
else update(l,mid,lson,jy),update(mid,r,rson,jy);
push_up(l,r,pos);
}
int main(){
while(scanf("%d",&N)&&N){
ans=tot=0;
for(int i=1;i<=N;i++){
double X1,Y1,X2,Y2;
scanf("%lf%lf%lf%lf",&X1,&Y1,&X2,&Y2);
node[++tot].x=X1,node[tot].y1=Y1,node[tot].y2=Y2;node[tot].cover=1;y[tot]=Y1;
node[++tot].x=X2,node[tot].y1=Y1,node[tot].y2=Y2;node[tot].cover=-1;y[tot]=Y2;
}
sort(node+1,node+1+tot,cmp),sort(y+1,y+1+tot);
n=unique(y+1,y+1+tot)-y-1;
build(1,n,1),update(1,n,1,node[1]);
for(int i=2;i<=tot;i++){
ans+=tree[1].len*(node[i].x-node[i-1].x);
update(1,n,1,node[i]);
}
printf("Test case #%d\nTotal explored area: %.2lf\n\n",++cases,ans);
}
}
最新文章
- centos6环境下搭建irc服务器
- 【SqlServer】empty table and delete table and create table
- 单例模式(singleton)
- Nginx配置文件说明
- ORACLE之ASM概念
- 在sublime-text中设置浏览器预览
- 百度或者Google---SEO优化
- FZU-1921+线段树
- jsonp封装
- GO求平均值
- 如何安装windows7系统
- php多进程编程详解
- 关于CoordinatorLayout的用法——复杂交互的克星
- RxJava操作符(05-结合操作)
- 使用 eclipse 的常用操作
- 算法进阶面试题07——求子数组的最大异或和(前缀树)、换钱的方法数(递归改dp最全套路解说)、纸牌博弈、机器人行走问题
- Enterprise Craftsmanship
- 远程桌面中Tab键不能补全的解决办法
- Android知识补充(Android学习笔记)
- 如何解决安卓(系统版本低) CSS3 动画问题---高性能动画
热门文章
- 多项福利回馈会员,且看Hao123怎样玩转“霸权主义”
- java发送邮件带附件
- ThinkPHP5.0框架开发--第5章 TP5.0 控制器
- angular4(2-2)angular脚手架引入第三方类库(swiper)
- Linux换行符相关
- Codeforces 986B. Petr and Permutations(没想到这道2250分的题这么简单,早知道就先做了)
- http状态码304
- Golang 中的 面向对象: 方法, 类, 方法继承, 接口, 多态的简单描述与实现
- 服务器搭建域控与SQL Server的AlwaysOn环境过程(一) 搭建域控服务器
- org.apache.ibatis.binding.BindingException: Parameter ‘brOrderNo’ not found. Available parameters ar