Atlantis(hdu1542)
题意:求n个矩阵的面积并。
- /*
- 线段树维护扫描线
- 把每个矩形看成两条线段,从左到右添加线段,如果是矩形左边的线段,那就给线段所在的区间(y值)cover+1,反之则cover-1。
- 并且如果这条线段添加之前它所在的区间的cover>0,则统计面积。
- 另外如果求面积的交集,线段所在的区间的cover>1时统计面积。
- PS:个人认为某位大神写的博客很好理解(这位大神还搞了一个线段树专辑?%%%):
- http://www.cnblogs.com/ka200812/archive/2011/11/13/2247064.html
- 但是我觉得第一种算法每次都要找到叶子节点,貌似有点浪费时间,然而第二种又不会。。。
- */
- #include<cstdio>
- #include<iostream>
- #include<algorithm>
- #define N 110
- using namespace std;
- double y[N*];int n,cnt,Cas;
- struct node{
- double x,y_down,y_up;int flag;
- bool operator < (const node &s1)const{
- return x<s1.x;
- }
- };node e[N*];
- struct Node{
- double x,y_down,y_up;int cover;
- int flag;//是否为叶子节点
- };Node tree[*N];
- void build(int k,int l,int r){
- tree[k].cover=;
- tree[k].x=-;//代表这个区间最近一次的横坐标
- tree[k].y_down=y[l];
- tree[k].y_up=y[r];
- tree[k].flag=;
- if(l+==r){
- tree[k].flag=;
- return;
- }
- int mid=l+r>>;
- build(k*,l,mid);
- build(k*+,mid,r);
- }
- double insert(int k,double x,double l,double r,int flag){
- if(r<=tree[k].y_down||l>=tree[k].y_up) return ;
- if(tree[k].flag){
- if(tree[k].cover>){
- double ans=(x-tree[k].x)*(tree[k].y_up-tree[k].y_down);
- tree[k].cover+=flag;
- tree[k].x=x;
- return ans;
- }
- else {
- tree[k].cover+=flag;
- tree[k].x=x;
- return ;
- }
- }
- double ans=;
- ans+=insert(k*,x,l,r,flag);
- ans+=insert(k*+,x,l,r,flag);
- return ans;
- }
- int main(){
- while(scanf("%d",&n)){
- if(!n) break;
- cnt=;
- for(int i=;i<=n;i++){
- double x1,y1,x2,y2;
- scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
- y[++cnt]=y1;
- e[cnt].x=x1;
- e[cnt].y_down=y1;
- e[cnt].y_up=y2;
- e[cnt].flag=;
- y[++cnt]=y2;
- e[cnt].x=x2;
- e[cnt].y_down=y1;
- e[cnt].y_up=y2;
- e[cnt].flag=-;
- }
- sort(y+,y+cnt+);//写成了sort(y,y+cnt+1),1WA
- sort(e+,e+cnt+);
- build(,,cnt);
- double ans=;
- for(int i=;i<=cnt;i++){
- ans+=insert(,e[i].x,e[i].y_down,e[i].y_up,e[i].flag);
- }
- printf("Test case #%d\nTotal explored area: %.2f\n\n",++Cas,ans);
- }
- return ;
- }
Atlantis(hdu1542)的更多相关文章
- 扫面线+线段树(hdu1542)
之前写过这个算法,时间长了就忘掉了,,现在不看书自己努力回想起来,对算法的理解,对线段树的理解感觉也更深了一点(可能心理作用,哈哈哈) 思路简单说一下吧 从做到右遍历每一条矩阵的边(左右边),看该边对 ...
- HDU 1542 Atlantis(扫描线算法)
题意:给出n个矩形的左下角左边和右上角坐标,求这n个矩形的面积并 原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 典型的扫描线算法的题目 什么是 ...
- POJ 1151 Atlantis(离散化)
点我看题目 题意 : 就是给你n个矩形的最左下角和最右上角的点的坐标,然后将这n个矩形的面积求出来. 思路 : 离散化求矩形面积并.离散化具体介绍.将横纵坐标离散开来分别存,然后排序,也可以按照黑书上 ...
- HDU 1542 Atlantis(扫描线)题解
题意:给n个可能相交的矩形,问你不重复的总面积 思路:扫描线,一边扫一边加. 扫描线:图片来源:理解扫描线 假设我们要算以下四个矩形面积,显然中间深色的是重复的.我们按照x的大小,从左往右扫,然后用线 ...
- 【POJ1151】Atlantis(线段树,扫描线)
[POJ1151]Atlantis(线段树,扫描线) 题面 Vjudge 题解 学一学扫描线 其实很简单啦 这道题目要求的就是若干矩形的面积和 把扫描线平行于某个轴扫过去(我选的平行\(y\)轴扫) ...
- HDU 1542"Atlantis"(线段树+扫描线求矩形面积并)
传送门 •题意 给你 n 矩形,每个矩形给出你 $(x_1,y_1),(x_2,y_2)$ 分别表示这个矩形的左下角和右上角坐标: 让你求这 n 个矩形并的面积: 其中 $x \leq 10^{5} ...
- Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求
上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...
- Angular2学习笔记(1)
Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...
- ASP.NET Core 之 Identity 入门(一)
前言 在 ASP.NET Core 中,仍然沿用了 ASP.NET里面的 Identity 组件库,负责对用户的身份进行认证,总体来说的话,没有MVC 5 里面那么复杂,因为在MVC 5里面引入了OW ...
随机推荐
- Log4net系列二:Log4net邮件日志以及授权码
Log4net邮件发送 上篇文章我们主要介绍Log4net生成文本格式,本篇文章主要配置邮箱发送.关于项目的引用,搭建我们就不在描述,如果不太清楚,请看上篇文章, 老规矩,我们现在配置文件中添加一个a ...
- new几种用法
在 C# 中,new 关键字可用作运算符.修饰符或约束. new 运算符 用于创建对象和调用构造函数. new 修饰符 用于向基类成员隐藏继承成员. new 约束 用于在泛型声明中约束可能用作类型参数 ...
- AJPFX总结string类和简单问题
String表示字符串,所谓字符串,就是一连串的字符;String是不可变类,一旦String对象被创建,包含在对象中的字符序列(内容)是不可变的,直到对象被销毁://一个String对象的内容不能变 ...
- joomla多语言建站之默认前台语言设置
joomla多语言建站后,如果想设置其中一种语言为默认前台语言,即: 从后台点击“Site Name”跳转时: 访问域名时: 页面自动切换至某一种语言,可以在后台通过“语言管理”模块来实现,将“网站前 ...
- php中session实现机制
一.默认机制,用磁盘文件来实现PHP会话.php.ini配置:session.save_handler = files 1.session_start() A. session_start()是ses ...
- DROP CAST - 删除一个用户定义的类型转换
SYNOPSIS DROP CAST (sourcetype AS targettype) [ CASCADE | RESTRICT ] DESCRIPTION 描述 DROP CAST 删除一个前面 ...
- uva1660 Cable TV Network
点连通度:最少删除几个点使图不连通 拆点就变成了最小割 注意编号.画图就知道u’连v,v’连u. 技巧:不需要枚举S,T.固定S,枚举T即可 这种输入很烦, scanf(" (%d,%d)& ...
- ERROR: HHH000091: Expected type: java.sql.Timestamp, actual value: java.lang.Integer
在将MySql的数据对应到Java的实体类的时候, 遇到了错误 关键点: Hibernate从mysql数据库查出来的Timestamp类型的数据, 会被Hibernate(或者是数据库连接池Drui ...
- STL源码分析与实现-stl_list容器
1. stl_list 介绍 今天我们来总结一下stl_List, 通过之前介绍单链表的文章,其实对链表的基本操作已经十分熟悉了,那对于stl_list,无非就是链表结构不一样,至于其中的增删改查的细 ...
- 2018美赛准备之路——Matlab基础——命令行功能函数
clc 清屏(只清除显示内容) clear 清除所有变量(运算结果) who 显示workspace的所有变量 whos 详细显示workspace的所有变量 help sin 显示sin函数 ...