hdu 1542 线段树之扫描线之面积并
题意:给你n个矩形,求它们的面积,反复的不反复计算
思路:用线段树的扫描线完毕。将X坐标离散化后,从下到上扫描矩形,进行各种处理,看代码凝视把
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e3+10;
#define mm(a) memset(a,0,sizeof(a))
int num1[maxn*4];
double num[maxn*4],X[maxn*4];
struct edge{
double l,r,h;
int s;//s为1是下边。s为-1是上边
edge(){};
edge(double a,double b,double c,int d) : l(a),r(b),h(c),s(d){}
bool operator<(const edge &n)const{
return h<n.h;
}
}ss[maxn];
void pushup(int le,int ri,int node){
if(num1[node]) num[node]=X[ri+1]-X[le];//在更新的时候,可能两个矩阵有重叠,这样就不能像曾经那么更新,而是将le和ri传入
else if(le==ri) num[node]=0; //然后将X[ri+1]-X[le]的值进行更新,避免了反复的长度
else num[node]=num[node<<1]+num[node<<1|1];
}
void update(int l,int r,int add,int le,int ri,int node){
if(l<=le&&ri<=r){
num1[node]+=add;//与懒惰标记相似
pushup(le,ri,node);
return ;
}
int t=(le+ri)>>1;
if(l<=t) update(l,r,add,le,t,node<<1);
if(r>t) update(l,r,add,t+1,ri,node<<1|1);
pushup(le,ri,node);
}
int main(){
int n,t=1;
while(scanf("%d",&n)!=-1){
if(n==0) break;
double a,b,c,d;
int k=0;
for(int i=0;i<n;i++){
scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
X[k]=a;
ss[k++]=edge(a,c,b,1);
X[k]=c;
ss[k++]=edge(a,c,d,-1);
}
sort(X,X+k);
sort(ss,ss+k);
int k1=1;
for(int i=1;i<k;i++){//对X进行离散化
if(X[i]!=X[i-1]) X[k1++]=X[i];
}
mm(num);mm(num1);
double ans=0;
for(int i=0;i<k-1;i++){
int l=lower_bound(X,X+k1,ss[i].l)-X;
int r=lower_bound(X,X+k1,ss[i].r)-X-1;
update(l,r,ss[i].s,0,k1-1,1);
ans+=num[1]*(ss[i+1].h-ss[i].h);//num[1]为当前横坐标的总长度
}
printf("Test case #%d\nTotal explored area: %.2f\n\n",t++,ans);
}
return 0;
}
hdu 1542 线段树之扫描线之面积并的更多相关文章
- HDU 1542 线段树离散化+扫描线 平面面积计算
也是很久之前的题目,一直没做 做完之后觉得基本的离散化和扫描线还是不难的,由于本题要离散x点的坐标,最后要计算被覆盖的x轴上的长度,所以不能用普通的建树法,建树建到r-l==1的时候就停止,表示某段而 ...
- hdu 1542 线段树扫描(面积)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- hdu 1542 线段树+扫描线 学习
学习扫描线ing... 玄学的东西... 扫描线其实就是用一条假想的线去扫描一堆矩形,借以求出他们的面积或周长(这一篇是面积,下一篇是周长) 扫描线求面积的主要思想就是对一个二维的矩形的某一维上建立一 ...
- HDU 1255 覆盖的面积(线段树:扫描线求面积并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 题目大意:给你若干个矩形,让你求这些矩形重叠两次及以上的部分的面积. 解题思路:模板题,跟HDU ...
- HDU Atlantis 线段树 表达区间 矩形面积相交
http://acm.hdu.edu.cn/showproblem.php?pid=1542 我的做法是把x轴的表示为线段,然后更新y 不考虑什么优化的话,开始的时候,把他们表达成线段,并按y排序,然 ...
- HDU 1542 线段树+扫描线+离散化
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- Atlantis HDU - 1542 线段树+扫描线 求交叉图形面积
//永远只考虑根节点的信息,说明在query时不会调用pushdown //所有操作均是成对出现,且先加后减 // #include <cstdio> #include <cstri ...
- hdu 1556(线段树之扫描线)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556 Color the ball Time Limit: 9000/3000 MS (Java/Ot ...
- hdu 1542 线段树 求矩形并
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
随机推荐
- cmd执行调用打开文件
Process p = new Process();//新进程 p.StartInfo.FileName = "cmd.exe";//打开cmd程序 p.StartInfo.Use ...
- 2016.04.19,英语,《Vocabulary Builder》Unit 16
top, comes from topos, the Greek word for 'place'. ectopic: [ek'tɑːpɪk] adj. [医]异位的,异常的 topical: ['t ...
- 国王的烦恼---nyoj
国王的烦恼 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 C国由n个小岛组成,为了方便小岛之间联络,C国在小岛间建立了m座大桥,每座大桥连接两座小岛.两个小岛间可能存在 ...
- 【Codeforces 258A】 Game With Sticks
[题目链接] http://codeforces.com/contest/451/problem/A [算法] 若n和m中的最小值是奇数,则先手胜,否则后手胜 [代码] #include<bit ...
- Jsoup的简单的使用示例
利用Jsoup中的相关方法实现网页中的数据爬去,本例子爬去的网页为比较流行的programmableweb中的mashup描述内容,然后为数据库中存在的mashup添加相应的描述. package c ...
- BZOJ 4547 矩阵快速幂
思路: 肯定每回只加最大值和次大值 如果 一开始的最大值>0且次大值<0 那就一直加 加到次大值>0 搞一个矩阵 推斐波那契数列 求和 就好- //By SiriusRen #inc ...
- 安装windwos7 iis 出现错误,并非所有都成功更改的解决办法
1.首先排除网上说的 安装的WIN7是精简版的问题,我这个是旗舰版,以前是正常安装IIS的,后来程序问题我卸载了,就安装不上了 2.网上说的修改什么UAC权限,也是胡扯,因为默认都是最低的 3.排除网 ...
- hdu1317 XYZZY Floyd + Bellman_Ford
这题,我在学搜索的时候做过.不过好像不叫这名字. 1.先用Floyd算法判断图的连通性.如果1与n是不连通的,输出hopeless. 2.用Bellman_Ford算法判断是否有正圈,如果某点有正圈, ...
- VS 在代码中括号总是跟着类型后面
if (OK.Text.Contains("运费")) {// 像这样子,这个大括号不是直接在IF下,而是跟在后面 工具-->选项-->文本编辑器-->C# -- ...
- 完整安装sqlserver always on集群
准备工作 1. 四台已安装windows server 2008 r2 系统的虚拟机,配置如下: CPU : 1核 MEMORY : 2GB DISK : 40GB(未分区) NetAdapter ...