矩形面积并

线段树-扫描线裸题

 #include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
const int maxm=2e3+;
const double eps=1e-; struct seg{
double x,y1,y2;
int c;
bool operator < (const seg a)const{
return x<a.x;
}
}s[maxm]; double y[maxm];
double st[maxm<<],st2[maxm<<];
int cov[maxm<<]; void pushup(int o,int l,int r){
if(cov[o]>){
st[o]=st2[o]=y[r]-y[l];
}
else if(cov[o]==){
st[o]=y[r]-y[l];
if(l+==r)st2[o]=;
else st2[o]=st[o<<]+st[o<<|];
}
else{
if(l+==r)st[o]=st2[o]=;
else{
st[o]=st[o<<]+st[o<<|];
st2[o]=st2[o<<]+st2[o<<|];
}
}
} void update(int o,int l,int r,seg a){
if(y[l]>=a.y1&&y[r]<=a.y2){
cov[o]+=a.c;
pushup(o,l,r);
return;
}
if(l+==r)return;
int m=l+((r-l)>>);
if(a.y1<=y[m])update(o<<,l,m,a);
if(a.y2>y[m])update(o<<|,m,r,a);
pushup(o,l,r);
} int main(){
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
memset(st,,sizeof(st));
memset(cov,,sizeof(cov));
memset(st2,,sizeof(st2));
for(int i=;i<=n;++i){
double x1,y1,x2,y2;
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
/* s[2*i-1].x=x1;
s[2*i].x=x2;
s[2*i-1].y1=y1;
s[2*i].y1=y1;
s[2*i-1].y2=y2;
s[2*i].y2=y2;
s[2*i-1].c=1;
s[2*i].c=-1;
y[2*i-1]=y1;
y[2*i]=y2;*/
s[*i-].x=x1;s[*i-].y1=y1;s[*i-].y2=y2;s[*i-].c=;
y[*i-]=y1;
s[*i].x=x2;s[*i].y1=y1;s[*i].y2=y2;s[*i].c=-;
y[*i]=y2;
}
sort(y+,y+*n+);
sort(s+,s+*n+);
/* int cnt=1;
for(int i=2;i<=2*n;++i){
if(y[i]!=y[i-1])y[++cnt]=y[i];
}*/
int cnt=*n;
double ans=;
update(,,cnt,s[]);
for(int i=;i<=*n;++i){
ans+=st2[]*(s[i].x-s[i-].x);
update(,,cnt,s[i]);
}
printf("%.2lf\n",ans);
}
return ;
}

hdu1255 覆盖的面积 线段树-扫描线的更多相关文章

  1. hdu1255 覆盖的面积 线段树+里离散化求矩形面积的交

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 求矩形面积的交的线段树题目,刚做了求并的题目,再做这个刚觉良好啊,只要再加一个表示覆盖次数大于1 ...

  2. HDU 1255 覆盖的面积 (线段树+扫描线+离散化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 题意很清楚,就是让你求矩阵之间叠加层数大于1的矩形块的面积和. 因为n只有1000,所以我离散化 ...

  3. HDU 1255 覆盖的面积 线段树+扫描线

    同 POJ1151 这次是两次 #include <iostream> #include <algorithm> #include <cstdio> #includ ...

  4. HDU1255 覆盖的面积 —— 求矩形交面积 线段树 + 扫描线 + 离散化

    题目链接:https://vjudge.net/problem/HDU-1255 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. Input输入数据的第一行是一个正整数T(1<= ...

  5. hdu 1255 覆盖的面积 (线段树处理面积覆盖问题(模板))

    http://acm.hdu.edu.cn/showproblem.php?pid=1255 覆盖的面积 Time Limit: 10000/5000 MS (Java/Others)    Memo ...

  6. H - 覆盖的面积(线段树-线段扫描 + 离散化(板题))

    给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. Input 输入数据的第一行是一个正整数T(1<=T<=100),代表测试数据的数量.每个测试数据的第一行是一个正整数N(1 ...

  7. HDU 1255 覆盖的面积(线段树面积并)

      描述 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. Input 输入数据的第一行是一个正整数T(1<=T<=100),代表测试数据的数量.每个测试数据的第一行是一个正 ...

  8. HDU 1255 覆盖的面积(线段树:扫描线求面积并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 题目大意:给你若干个矩形,让你求这些矩形重叠两次及以上的部分的面积. 解题思路:模板题,跟HDU ...

  9. hdu1255 矩阵的交 线段树+扫描线

    /* 不是叶子节点 ,且cnt=1.注意这里,cnt=1确切的意义是什么, 应该是,可以确定,这个区间被完全覆盖了1次, 而有没有被完全覆盖两次或以上则不知道无法确定,那么怎么怎么办了, 只要加上t[ ...

随机推荐

  1. 读CSV文件

    /// <summary> /// 读取csv文件 /// </summary> /// <param name="csvPath">strin ...

  2. linux下修改mysql登录密码

    一.修改mysql密码 1.停止服务      /etc/init.d/mysqld stop   2.以不检查权限的方式启动     /etc/init.d/mysqld --skip-grant- ...

  3. python-day33--进程间通信(IPC)

    方式:队列(推荐使用) 一.基本情况 1.可以往队列里放任意类型的数据 2. 队列:先进先出 3. q=Queue(3) #可以设置队列中最多可以进入多少个值,也可以不设置 q.put('first' ...

  4. POJ-1753 Flip Game (BFS+状态压缩)

    Description Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of i ...

  5. ADO.NET 体系结构

    两个部分 .NET 数据提供者 DataSet 数据提供者 SqlClient 提供者 OleDb 提供者 Odbc 提供者 数据提供者组件 数据对象 DataSet

  6. Freemaker FTL指令常用标签及语法

    https://blog.csdn.net/pengpengpeng85/article/details/52070602 FTL指令常用标签及语法 注意:使用freemaker,要求所有标签必须闭合 ...

  7. Dos命令的介绍

    Dos命令的介绍目录 1.什么是Dos 2.Dos的简介 3.Dos命令有哪些 4.Dos命令下常见的错误信息 5.Config.sys文件的命令和配置 6.Dos自带的的批处理命令 1.什么是Dos ...

  8. kernel build command

    Uboot: make ARCH=arm CROSS_COMPILE=${CC} distclean make ARCH=arm CROSS_COMPILE=${CC} am335x_evm_defc ...

  9. pip install flask 安装失败

    地址:http://www.zhihu.com/question/21492455

  10. ps和fireworks切图网页优化,jpg为80时