http://acm.hdu.edu.cn/showproblem.php?pid=1255

典型线段树辅助扫描线,顾名思义扫描线就是相当于yy出一条直线从左到右(也可以从上到下)扫描过去,此时先将所有的横坐标和纵坐标排序

因为是从左到右扫描,那么横坐标应该离散化一下

当扫描线依次扫描的时候,依次扫描到的纵区间在线段树中查找,依据是上边还是下边记录,上边就是-1,下边就是+1,

如果某区间记录值为0的时候,代表没有被覆盖,为1的时候代表覆盖一次,为2代表覆盖两次(不会出现为负数的情况)

最后将依次扫描的覆盖两次的纵区间长度乘以以此的横坐标的和就行

所以http://acm.hdu.edu.cn/search.php?action=listproblem hdu1542 就在稍微改改这题的代码就行了

code

 #include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct node{
double x,y1,y2;
double flag;
};
node num[];
double a[];
bool cmp(node q,node w){return q.x<w.x;}
struct point {
int l,r,mark;
double lf,rf;
double once; //覆盖一次
double twice;//覆盖两次
};
point tree[*];
void build(int i,int left,int right)
{
tree[i].l=left,tree[i].r=right;
tree[i].once=tree[i].twice=;
tree[i].lf=a[left];
tree[i].rf=a[right];
if (left+==right) return ;
int mid=(left+right)/;
build(i*,left,mid);
build(i*+,mid,right);
}
void find(int i)
{
if (tree[i].mark>=)
{
tree[i].twice=tree[i].once=tree[i].rf-tree[i].lf;
return;
}
else if (tree[i].mark==)
{
tree[i].once=tree[i].rf-tree[i].lf;
if (tree[i].l+==tree[i].r) tree[i].twice=;
else tree[i].twice=tree[i*].once+tree[i*+].once;
}
else
{
if(tree[i].l+==tree[i].r)
tree[i].once=tree[i].twice=;
else
{
tree[i].once=tree[i*].once+tree[i*+].once;
tree[i].twice=tree[i*].twice+tree[i*+].twice;
}
}
}
void update(int i,node g)
{
//printf("***%d***\n",i);
if (g.y1==tree[i].lf&&g.y2==tree[i].rf)
{
tree[i].mark+=g.flag;
find(i); //更新区间
return ;
}
if (g.y2<=tree[i*].rf) update(i*,g);
else if (g.y1>=tree[i*+].lf) update(i*+,g);
else
{
node temp=g;
temp.y2=tree[i*].rf;
update(i*,temp);
temp=g;
temp.y1=tree[i*+].lf;
update(i*+,temp);
}
find(i);
}
int main()
{
int t,n,i,k;
double x1,x2,y1,y2,ans;
while (~scanf("%d",&k))
{
while (k--)
{
scanf("%d",&n);
t=;
while (n--)
{
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
num[t].x=x1,num[t].y1=y1,num[t].y2=y2;
num[t].flag=;a[t]=y1;
t++;
num[t].x=x2,num[t].y1=y1,num[t].y2=y2;
num[t].flag=-;a[t]=y2;
t++;
}
sort(num+,num+t,cmp);
sort(a+,a+t);
ans=;
build(,,t-);
//printf("-1\n");
update(,num[]);
for (i=;i<t;i++)
{
ans+=tree[].twice*(num[i].x-num[i-].x);
update(,num[i]);
}
printf("%.2lf\n",ans);
}
}
return ;
}

hdu 1255(线段树 扫描线) 覆盖的面积的更多相关文章

  1. hdu 4419 线段树 扫描线 离散化 矩形面积

    //离散化 + 扫描线 + 线段树 //这个线段树跟平常不太一样的地方在于记录了区间两个信息,len[i]表示颜色为i的被覆盖的长度为len[i], num[i]表示颜色i 『完全』覆盖了该区间几层. ...

  2. 覆盖的面积 HDU - 1255 线段树+扫描线+离散化 求特定交叉面积

    #include<cstdio> #include<map> #include<algorithm> using namespace std; ; struct N ...

  3. hdu 1828 线段树扫描线(周长)

    Picture Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  4. hdu 4052 线段树扫描线、奇特处理

    Adding New Machine Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  5. POJ-1151-Atlantis(线段树+扫描线+离散化)[矩形面积并]

    题意:求矩形面积并 分析:使用线段树+扫描线...因为坐标是浮点数的,因此还需要离散化! 把矩形分成两条边,上边和下边,对横轴建树,然后从下到上扫描上去,用col表示该区间有多少个下边,sum代表该区 ...

  6. hdu1542 线段树扫描线求矩形面积的并

    题意:       给你n个正方形,求出他们的所占面积有多大,重叠的部分只能算一次. 思路:       自己的第一道线段树扫描线题目,至于扫描线,最近会写一个总结,现在就不直接在这里写了,说下我的方 ...

  7. hdu 5091(线段树+扫描线)

    上海邀请赛的一道题目,看比赛时很多队伍水过去了,当时还想了好久却没有发现这题有什么水题的性质,原来是道成题. 最近学习了下线段树扫描线才发现确实是挺水的一道题. hdu5091 #include &l ...

  8. HDU 5107 线段树扫描线

    给出N个点(x,y).每一个点有一个高度h 给出M次询问.问在(x,y)范围内第k小的高度是多少,没有输出-1 (k<=10) 线段树扫描线 首先离散化Y坐标,以Y坐标建立线段树 对全部的点和询 ...

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

    覆盖的面积 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem D ...

随机推荐

  1. Python基础学习Day7 基础数据类型的扩展 集合 深浅copy

    一.基础数据类型的扩展 1.1GBK ---> UTF - 8 # str --->bytes s1 = '太白' # 字符串是unicode编码 b1 = s1.encode('gbk' ...

  2. 源码编译安装Python3及问题解决

    https://chowyi.com/%E6%BA%90%E7%A0%81%E7%BC%96%E8%AF%91%E5%AE%89%E8%A3%85Python3%E5%8F%8A%E9%97%AE%E ...

  3. idea 修改 使用的git账号

    打开控制面板-->用户账户-->凭证管理器 如下图点击进入,删除原有的账号 当在idea中再提交或下载代码时,就会弹出如下提示框: 重新输入你自己的账号就可以了.

  4. HashMap、LinkedHashMap、ConcurrentHashMap、ArrayList、LinkedList 底层实现

    HashMap相关问题 1.你用过HashMap吗?什么是HashMap?你为什么用到它? 用过,HashMap是基于哈希表的Map接口的非同步实现,它允许null键和null值,且HashMap依托 ...

  5. Mysql 表约束 非空、唯一、主键、自增长、默认、外键约束(基础6)

    非空(not null).唯一(unique key).主键(primary key).自增长(auto_increment).默认约束(default) 准备基础环境: mysql> crea ...

  6. Django项目的创建与管理和pycharm与Github的秘密

    随笔 - 174  文章 - 21  评论 - 19 Django项目创建与管理   1.主题 这部分教程主要介绍如何通过Pycharm创建.管理.运行一个Django工程.对于Django模块的相关 ...

  7. Python_变量命名

    Python的变量命名 变量的命名的原则一直都是我这种小白的头疼事,好几条,根本记不住...... 为了解决大家的头疼问题,今天想出来一个好办法,那就是:身边常备头疼片.......(哈哈哈,开玩笑的 ...

  8. laravel5.6上传图片及显示

    借鉴大神博客:https://blog.csdn.net/tony_110/article/details/80105099文档:http://laravelacademy.org/post/8965 ...

  9. 将图片转换为Base64编码的字符串

    图片以文件的形式存在,可以在表单中使用. 也可以转换成Base64编码的字符串,从而在css.js中以字符串的形式使用图片.例如,在css中设置背景图片.在js中用ajax上传图片. <!DOC ...

  10. am start的总结,-d参数的总结,以及python中传递内容包含中文及特殊字符&的解决方案

    一.am start的内容的整理 主要包含以下内容:am start的常规操作及参数的含义,-d 参数的含义,以及如何在APK中设置参数获取 使用命令如下:adb shell am start -n ...