hdu1542 线段树+扫描线+离散化
仅仅想说题目给的欲实际不服 还是这类型的水题吧 建议看之前我写的那个
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
#define LL(x) (x<<1)
#define RR(x) ((x<<1)|1)
int n;
struct node
{
double y;
int x1,x2;
int flash;
}A[31000];
struct Node
{
int ii;
double x;
}change[35000];
int cmp1(Node a,Node b)
{
return a.x<b.x;
}
int cmp2(node a,node b)
{
return a.y<b.y;
}
int num[80000];
double map[31000];
int update(int L,int R,int left,int right,int k,int mark)
{
int mid=(L+R)/2;
if(L==left&&right==R)
{
if(num[mark]!=-1)
{
num[mark]+=k;
return 0;
}
update(L,mid,L,mid,k,LL(mark));
update(mid,R,mid,R,k,RR(mark));
if(num[LL(mark)]==num[RR(mark)]) num[mark]=num[LL(mark)];
else num[mark]=-1;
}
else
{
if(num[mark]>=0)
{
num[LL(mark)]=num[RR(mark)]=num[mark];
}
if(right<=mid)
{
update(L,mid,left,right,k,LL(mark));
}
else if(left>=mid)
{
update(mid,R,left,right,k,RR(mark));
}
else
{
update(L,mid,left,mid,k,LL(mark));
update(mid,R,mid,right,k,RR(mark));
}
if(num[LL(mark)]==num[RR(mark)]) num[mark]=num[LL(mark)];
else num[mark]=-1;
}
return 0;
}
double find(int L,int R,int mark)
{
double Long=0;
if(num[mark]>=1)
{
Long+=map[R]-map[L];
return Long;
}
if(num[mark]==0) return 0;
int mid=(L+R)/2;
Long+=find(L,mid,LL(mark))+find(mid,R,RR(mark));
return Long;
}
int main()
{
int i,j,d=1;
double x1,y1,x2,y2;
while(~scanf("%d",&n),n)
{
n*=2;
//j=0;
memset(A,0,sizeof(A));
memset(map,0,sizeof(map));
memset(change,0,sizeof(change));
for(i=1;i<=n;i+=2)
{
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
A[i].y=y1;
A[i].flash=1;
A[i+1].y=y2;
A[i+1].flash=-1;
change[i].x=x1;
change[i+1].ii=change[i].ii=i;
change[i+1].x=x2;
}
int leap[10000];
memset(leap,0,sizeof(leap));
sort(change+1,change+1+n,cmp1);
int j=0;
double k=-1;
for(i=1;i<=n;i++)
{
if(change[i].x!=k)
{
k=change[i].x;
++j;
map[j]=change[i].x;
}
if(leap[change[i].ii]==0)
{
A[change[i].ii].x1=A[change[i].ii+1].x1=j;
leap[change[i].ii]=1;
}
else A[change[i].ii].x2=A[change[i].ii+1].x2=j;
}
sort(A+1,A+1+n,cmp2);
memset(num,0,sizeof(num));
update(1,j,A[1].x1,A[1].x2,1,1);
double area=0;
for(i=2;i<=n;i++)
{
area+=find(1,j,1)*(A[i].y-A[i-1].y);
if(A[i].flash==1)
update(1,j,A[i].x1,A[i].x2,1,1);
else update(1,j,A[i].x1,A[i].x2,-1,1);
}
printf("Test case #%d\n",d++);
printf("Total explored area: %.2lf\n",area);
printf("\n");
}
return 0;
}
hdu1542 线段树+扫描线+离散化的更多相关文章
- hdu1542 Atlantis (线段树+扫描线+离散化)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- POJ-1151-Atlantis(线段树+扫描线+离散化)[矩形面积并]
题意:求矩形面积并 分析:使用线段树+扫描线...因为坐标是浮点数的,因此还需要离散化! 把矩形分成两条边,上边和下边,对横轴建树,然后从下到上扫描上去,用col表示该区间有多少个下边,sum代表该区 ...
- hdu1542 线段树扫描线求矩形面积的并
题意: 给你n个正方形,求出他们的所占面积有多大,重叠的部分只能算一次. 思路: 自己的第一道线段树扫描线题目,至于扫描线,最近会写一个总结,现在就不直接在这里写了,说下我的方 ...
- HDU1542 Atlantis —— 求矩形面积并 线段树 + 扫描线 + 离散化
题目链接:https://vjudge.net/problem/HDU-1542 There are several ancient Greek texts that contain descript ...
- poj1151 Atlantis (线段树+扫描线+离散化)
有点难,扫描线易懂,离散化然后线段树处理有点不太好理解. 因为这里是一个区间,所有在线段树中更新时,必须是一个长度大于1的区间才是有效的,比如[l,l]这是一根线段,而不是区间了. AC代码 #inc ...
- hdu 4419 线段树 扫描线 离散化 矩形面积
//离散化 + 扫描线 + 线段树 //这个线段树跟平常不太一样的地方在于记录了区间两个信息,len[i]表示颜色为i的被覆盖的长度为len[i], num[i]表示颜色i 『完全』覆盖了该区间几层. ...
- HDU 1542 Atlantis (线段树 + 扫描线 + 离散化)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- HDU 1542 Atlantis(线段树扫描线+离散化求面积的并)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- HDU 1255 覆盖的面积 (线段树+扫描线+离散化)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 题意很清楚,就是让你求矩阵之间叠加层数大于1的矩形块的面积和. 因为n只有1000,所以我离散化 ...
随机推荐
- Kafka的3节点集群详细启动步骤(Zookeeper是外装)
首先,声明,kafka集群是搭建在hadoop1.hadoop2和hadoop3机器上. kafka_2.10-0.8.1.1.tgz的1或3节点集群的下载.安装和配置(图文详细教程)绝对干货 如下分 ...
- scala的Map
package com.test.scala.test object MapTest { def main(args: Array[String]): Unit = { //定义一个不可变的map v ...
- MYSQL创建用户和授权方法(测试mysql5.7)
一.创建用户: 命令:CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明:username - 你将创建的用户名, host - 指 ...
- Java&Xml教程(一)简介
XML是广泛用于数据传输和存储的技术.Java语言提供个各种各样的API来解析XML,例如DOM.SAX.StAX.JAXB.也还有一些其他的API用于解析XML,例如JDOM.本教程的目的是探索使用 ...
- Android基于HttpUrlConnection类的文件下载
/** * get方法的文件下载 * <p> * 特别说明 android中的progressBar是google唯一的做了处理的可以在子线程中更新UI的控件 * * @param pat ...
- VC socket api使用引入
1.在创建项目时勾上windows socket api的使用 2.头文件 #pragma comment(lib,"WS2_32.lib") 3.初始化 WSADATA dat ...
- 02--Tomcat总体结构分析一
注:此文章大部分参考大神文档,并且结合自身理解,补充了其他相关知识,谢绝转载. 大神原文地址链接:http://www.ibm.com/developerworks/cn/java/j-lo ...
- (转)Hibernate的配置详解
http://blog.csdn.net/yerenyuan_pku/article/details/65041077 在<Hibernate快速入门>一文中,我有讲到Hibernate的 ...
- (转)Hibernate中的多表操作
http://blog.csdn.net/yerenyuan_pku/article/details/70556208 Hibernate中的多表操作 在实际开发中,我们不可能只是简简单单地去操作单表 ...
- Linux 开启443端口
1 在Linux终端输入指令: iptables -I INPUT -p tcp --dport 443 -j ACCEPT 2 回车之后继续输入指令,输入保存防火墙配置指令: service ...