仅仅想说题目给的欲实际不服     还是这类型的水题吧   建议看之前我写的那个

#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 线段树+扫描线+离散化的更多相关文章

  1. hdu1542 Atlantis (线段树+扫描线+离散化)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

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

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

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

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

  4. HDU1542 Atlantis —— 求矩形面积并 线段树 + 扫描线 + 离散化

    题目链接:https://vjudge.net/problem/HDU-1542 There are several ancient Greek texts that contain descript ...

  5. poj1151 Atlantis (线段树+扫描线+离散化)

    有点难,扫描线易懂,离散化然后线段树处理有点不太好理解. 因为这里是一个区间,所有在线段树中更新时,必须是一个长度大于1的区间才是有效的,比如[l,l]这是一根线段,而不是区间了. AC代码 #inc ...

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

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

  7. HDU 1542 Atlantis (线段树 + 扫描线 + 离散化)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  8. HDU 1542 Atlantis(线段树扫描线+离散化求面积的并)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

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

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

随机推荐

  1. Hibernate 配置双向多对多关联

    本文解决问题:Hibernate 中配置项目(Project) 员工(Employee)   双向多对多关联 方案一:直接配置双向多对多 方案二:配置第三个关联类(xml)   将多对多查分开来(形成 ...

  2. [ HAOI 2008 ] 玩具取名

    \(\\\) \(Description\) 在一个只有\(W,I,N,G\)的字符集中,给出四个字符的若干映射,每个映射为一个字符映射到两个字符,现给你一个假定由一个字符经过多次映射产生的字符串,问 ...

  3. hibernate映射数据库时@ManyToOne和@OneToMany

    第一次用hibernate自动生成表,涉及到多个表的外键,用到了@OneToMany和@ManyToOne注解碰到了几个错误. 首先声明一个基础,@OneToMany和@ManyToOne两个注解没有 ...

  4. Mongodb——文档数据库

    mongodb是一个文档数据库. mongo操作 多个修改操作,但每个修改携带的数据包较小,可操作考虑批量操作.bulkWrite()改善性能. MongoCollection是线程安全的. db.c ...

  5. HDU_1848_博弈,sg函数

    Fibonacci again and again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Jav ...

  6. 宏基因组扩增子图表解读2散点图:组间整体差异分析(Beta多样性)

    散点图 数据点在直角坐标系平面上的分布图.在宏基因组领域,散点图常用于展示样品组间的Beta多样性,常用的分析方法有主成分分析(PCA),主坐标轴分析(PCoA/MDS)和限制条件的主坐标轴分析(CP ...

  7. 人工智能时代,你为什么一定要学Python?

    Python岗位年薪至少在10-20w之间,而且除了北.上.广.深外,杭州和合肥等二.三线城市的待遇正在与一线城市持平.未来,无论你身处何地,都能享受到人工智能.Python“带来的“市场红利”. P ...

  8. Linux之iptables(二、基本认识和组成)

    iptables的基本认识 Netfilter组件 内核空间,集成在linux内核中 扩展各种网络服务的结构化底层框架 内核中选取五个位置放了五个hook(勾子) function(INPUT.OUT ...

  9. Linux之FTP/TFTP(vsftp、vsftpd) HTTP(httpd、apache) DHCP(dhcpd)

    FTP/TFTP(vsftp.vsftpd): FTP是File Transfer Protocol(文件传输协议)而中文简称为"文传协议".用于Internet上的控制文件的双向 ...

  10. 字符串匹配的BF算法和KMP算法学习

    引言:关于字符串 字符串(string):是由0或多个字符组成的有限序列.一般写作`s = "123456..."`.s这里是主串,其中的一部分就是子串. 其实,对于字符串大小关系 ...