题意:求矩形面积的并

思路:

注意是[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);
}
}

最新文章

  1. centos6环境下搭建irc服务器
  2. 【SqlServer】empty table and delete table and create table
  3. 单例模式(singleton)
  4. Nginx配置文件说明
  5. ORACLE之ASM概念
  6. 在sublime-text中设置浏览器预览
  7. 百度或者Google---SEO优化
  8. FZU-1921+线段树
  9. jsonp封装
  10. GO求平均值
  11. 如何安装windows7系统
  12. php多进程编程详解
  13. 关于CoordinatorLayout的用法——复杂交互的克星
  14. RxJava操作符(05-结合操作)
  15. 使用 eclipse 的常用操作
  16. 算法进阶面试题07——求子数组的最大异或和(前缀树)、换钱的方法数(递归改dp最全套路解说)、纸牌博弈、机器人行走问题
  17. Enterprise Craftsmanship
  18. 远程桌面中Tab键不能补全的解决办法
  19. Android知识补充(Android学习笔记)
  20. 如何解决安卓(系统版本低) CSS3 动画问题---高性能动画

热门文章

  1. 多项福利回馈会员,且看Hao123怎样玩转“霸权主义”
  2. java发送邮件带附件
  3. ThinkPHP5.0框架开发--第5章 TP5.0 控制器
  4. angular4(2-2)angular脚手架引入第三方类库(swiper)
  5. Linux换行符相关
  6. Codeforces 986B. Petr and Permutations(没想到这道2250分的题这么简单,早知道就先做了)
  7. http状态码304
  8. Golang 中的 面向对象: 方法, 类, 方法继承, 接口, 多态的简单描述与实现
  9. 服务器搭建域控与SQL Server的AlwaysOn环境过程(一) 搭建域控服务器
  10. org.apache.ibatis.binding.BindingException: Parameter ‘brOrderNo’ not found. Available parameters ar