Atlantis HDU - 1542
Problem Description
Input
The input file is terminated by a line containing a single 0. Don’t process it.
Output
Output a blank line after each test case.
10 10 20 20
15 15 25 25.5
0
Total explored area: 180.00
题解:
好像这个是线段树扫描线矩阵合并模板
#include<cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
const int MAXN=300;
const int INF=0x3f3f3f3f;
const int MOD=1e9+7;
int n;
double all[MAXN];
struct Seg{
double l,r,h;
int d;
Seg(){};//这是一个构造函数,应与结构体或类名相同
Seg(double l,double r,double h,int d):l(l),r(r),h(h),d(d){}
bool operator <(const Seg& rhs )const {
return h<rhs.h;
}
}a[MAXN];
int cnt[MAXN<<2];//懒标记
double sum[MAXN<<2]; void pushup(int l,int r,int rt )
{
if(cnt[rt]) sum[rt]=all[r+1]-all[l];
else if(l==r) sum[rt]=0;
else{
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
} void update(int L,int R,int v,int l,int r,int rt)//区间更新
{
if(l>=L&&r<=R)
{
cnt[rt]+=v;
pushup(l,r,rt);
return;
}
int mid=(l+r)>>1;
if(L<=mid)update(L,R,v,l,mid,rt<<1);
if(R>mid) update(L,R,v,mid+1,r,rt<<1|1);
pushup(l,r,rt);
} int main()
{
int Case=0;
while (scanf("%d",&n)!=EOF&&n)
{
double x1,y1,x2,y2;
for (int i = 1; i <=n ; ++i) {
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
a[i]=Seg(x1,x2,y1,1);
a[i+n]=Seg(x1,x2,y2,-1); all[i]=x1;all[i+n]=x2;
}
n<<=1;
sort(a+1,a+1+n);//使线条从下向上排列。 sort(all+1,all+n+1);
int m=unique(all+1,all+1+n)-all-1;//这个函数是"去掉"相邻位置的重复,移到末尾
memset(sum,0,sizeof(sum));
memset(cnt,0, sizeof(cnt));
double ans=0;
for (int i = 1; i <n ; ++i) { int l=lower_bound(all+1,all+1+m,a[i].l)-all;//离散化
int r=lower_bound(all+1,all+1+m,a[i].r)-all; if(l<r) update(l,r-1,a[i].d,1,m,1); ans+=sum[1]*(a[i+1].h-a[i].h);
} printf("Test case #%d\nTotal explored area: %.2lf\n\n",++Case,ans); }
return 0;
}
Atlantis HDU - 1542的更多相关文章
- 线段树 扫描线 L - Atlantis HDU - 1542 M - City Horizon POJ - 3277 N - Paint the Wall HDU - 1543
学习博客推荐——线段树+扫描线(有关扫描线的理解) 我觉得要注意的几点 1 我的模板线段树的叶子节点存的都是 x[L]~x[L+1] 2 如果没有必要这个lazy 标志是可以不下传的 也就省了一个pu ...
- 线段树扫描线(一、Atlantis HDU - 1542(覆盖面积) 二、覆盖的面积 HDU - 1255(重叠两次的面积))
扫描线求周长: hdu1828 Picture(线段树+扫描线+矩形周长) 参考链接:https://blog.csdn.net/konghhhhh/java/article/details/7823 ...
- Atlantis HDU - 1542 (线段树扫描线)
There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some ...
- Atlantis HDU - 1542 (扫描线,线段树)
扫描线的模板题,先把信息接收,然后排序,记录下上边和下边,然后用一条虚拟的线从下往上扫.如果我扫到的是下边,那么久用线段树在这个区间内加上1,表示这个区间现在是有的,等我扫描到上边的时候在加上-1,把 ...
- 线段树->面积并 Atlantis HDU - 1542
题目链接:https://cn.vjudge.net/problem/HDU-1542 题目大意:求面积并 具体思路:我们首先把矩形分割成一横条一横条的,然后对于每一个我们给定的矩形,我们将储存两个点 ...
- Atlantis HDU - 1542 线段树+扫描线 求交叉图形面积
//永远只考虑根节点的信息,说明在query时不会调用pushdown //所有操作均是成对出现,且先加后减 // #include <cstdio> #include <cstri ...
- HDU 1542 Atlantis(线段树扫描线+离散化求面积的并)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- (HDU 1542) Atlantis 矩形面积并——扫描线
n个矩形,可以重叠,求面积并. n<=100: 暴力模拟扫描线.模拟赛大水题.(n^2) 甚至网上一种“分块”:分成n^2块,每一块看是否属于一个矩形. 甚至这个题就可以这么做. n<=1 ...
- HDU 1542 Atlantis(矩形面积并)
HDU 1542 Atlantis 题目链接 题意:给定一些矩形,求面积并 思路:利用扫描线,因为这题矩形个数不多,直接暴力扫就能够了.假设数据大.就要用线段树 代码: #include <cs ...
随机推荐
- 基于Python3 神经网络的实现
基于Python3 神经网络的实现(下载源码) 本次学习是Denny Britz(作者)的Python2神经网络项目修改为基于Python3实现的神经网络(本篇博文代码完整).重在理解原理和实现方法, ...
- Dojo 学习笔记 之 Dojo hitch&partial
原文: http://dojotoolkit.org/documentation/tutorials/1.10/hitch/index.html 版本: Dojo 1.10 为了更好地使用JavaSc ...
- Use Exception.ToString() instead of Exception.Message.
Exception.Message contains only the message (doh) associated with the exception. Example: Object ref ...
- 使用COCOStudio中各种资源
UI Editor: 先把项目导出的json和资源文件放到TestGame项目的Resource目录中 1. 在HelloWorldScene.cpp顶部添加引用#include "coco ...
- Properties的使用以及配置文件值的获取
一.项目的部署如下,现在要获取SystemGlobals.properties中的值 二.代码如下: package com.util; import java.io.IOException; imp ...
- LDAP 在ubuntu14.04下的安装配置install and configure
https://help.ubuntu.com/lts/serverguide/openldap-server.html if error occurs in reinstall, try this: ...
- win10下同时安装jdk1.7,1.8
摘要:在开发不同项目时,可能会用到不同的jdk,需要我们在不同的jdk之间切换,怎么样在同一电脑上装不同的jdk,以此总结 1.正常安装jdk1.7,1.8 显示安装了jdk1.7,再安装jd ...
- CVE-2017-8464 LNK文件(快捷方式)远程代码执行漏洞复现
北京时间2017年6月13日凌晨,微软官方发布6月安全补丁程序,“震网三代” LNK文件远程代码执行漏洞(CVE-2017-8464)和Windows搜索远程命令执行漏洞(CVE-2017-8543) ...
- IOS 多线程-pthread
#import <pthread.h> @interface HMViewController () - (IBAction)btnClick; @end @implementation ...
- 2018.8.3 Java中容易犯错误的问题思考与总结
Java容易犯错误的问题思考 float型 float f = 3.4 是否正确 不正确,应该用强制类型转换.如下所示:float f = (float)3.4 或float f = 3.4f 在ja ...