hdu 1255 矩形覆盖面积(面积交)
http://www.cnblogs.com/scau20110726/archive/2013/04/14/3020998.html
面积交和面积并基本上差不多。在面积并里,len[]记录的是覆盖一次或以上的长度。如果想要知道覆盖两次或以上的长度,可以加入一个len2[]数组。
1.col[rt]>=2 : 说明该区间被覆盖两次或以上,那么长度就可以直接计算,就是该区间的长度
2.先看叶子节点,因为是叶子没有孩子了,所以被覆盖两次货以上的长度就是0(无论col[rt]=1或col[rt]=0都是0,因为是叶子。。。)
3.不是叶子节点 ,且col[rt]=1.注意这里,col[rt]=1确切的意义是什么,应该是,可以确定,这个区间被完全覆盖了1次,而有没有被完全覆盖两次或以上则不知道无法确定,那么怎么怎么办了,只要加上len[rson] + len[rson] 即,看看左右孩子区间被覆盖了一次或以上的长度,那么叠加在双亲上就是双亲被覆盖两次或以上的长度
3.不是叶子节点,且col[rt]=0,确切的意义应该是不完全不知道被覆盖的情况(不知道有没有被覆盖,被覆盖了几次,长度是多少都不知道),这种情况,只能由其左右孩子的信息所得
len2[lson] + len2[rson] , 即直接将左右孩子给覆盖了两次或以上的长度加起来,这样才能做到不重不漏
#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <stack>
#include <queue>
#include <cctype>
#include <vector>
#include <iterator>
#include <set>
#include <map>
#include <sstream>
using namespace std; #define mem(a,b) memset(a,b,sizeof(a))
#define pf printf
#define sf scanf
#define spf sprintf
#define pb push_back
#define debug printf("!\n")
#define MAXN 2000+5
#define MAX(a,b) a>b?a:b
#define blank pf("\n")
#define LL long long
#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())
#define pqueue priority_queue
#define INF 0x3f3f3f3f #define ls (rt<<1)
#define rs (rt<<1|1) int n,m; double hh[MAXN],col[MAXN<<],len[MAXN<<],len2[MAXN<<]; struct node
{
double l,r,x,c;
node(){}
node(double a,double b,double c,double d):l(a),r(b),x(c),c(d){}
bool operator < (const node &b) const
{
return x<b.x;
}
}a[MAXN]; void PushUp(int rt,int l,int r)
{
if(col[rt]>=)
{
len[rt] = len2[rt] = hh[r+] - hh[l];
}
else if(col[rt] == )
{
len[rt] = hh[r+]-hh[l];
if(l == r) len2[rt] = ;
else len2[rt] = len[rs]+len[ls];
}
else if(l==r) len[rt] = len2[rt] = ;
else
{
len[rt] = len[ls]+len[rs];
len2[rt] = len2[ls]+len2[rs];
}
} void update(int val,int L,int R,int l,int r,int rt)
{
if(L<=l && r<=R)
{
col[rt] += val;
PushUp(rt,l,r);
return;
}
int mid = (l+r)>>;
if(L <= mid) update(val,L,R,l,mid,ls);
if(R > mid) update(val,L,R,mid+,r,rs);
PushUp(rt,l,r);
} int main()
{
int i,j,k,t,kase=;
sf("%d",&t);
while(t--)
{
sf("%d",&n);
int v=;
double sum = ;
for(i=;i<n;i++)
{
double x1,y1,x2,y2;
sf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
hh[v] = y1;
a[v++] = node(y1,y2,x1,);
hh[v] = y2;
a[v++] = node(y1,y2,x2,-);
}
sort(hh,hh+v);
sort(a,a+v);
int d = ;
for(i=;i<v;i++)
{
if(hh[i]!=hh[i-]) hh[d++] = hh[i];
}
mem(len,);
mem(col,);
for(i=;i<v-;i++)
{
int l = lower_bound(hh,hh+d,a[i].l)-hh;
int r = lower_bound(hh,hh+d,a[i].r)-hh-;
update(a[i].c,l,r,,d-,);
sum+=len2[]*(a[i+].x-a[i].x);
//pf("%lf %lf\n",sum,len[1]);
}
pf("%.2lf\n",sum);
} return ;
}
hdu 1255 矩形覆盖面积(面积交)的更多相关文章
- 【 HDU 1255】 覆盖的面积(矩阵面积交,线段树,扫描法)
[题目] 覆盖的面积 Problem Description 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. Input 输入数据的第一行是一个正整数T(1<=T<=100 ...
- hdu 3265 矩形剪块面积并
http://acm.hust.edu.cn/vjudge/problem/10769 给n张海报,在每张海报上剪掉一个矩形,求面积并 把剪块的海报分成四个矩形,就是普通的求面积并问题了 #inclu ...
- 覆盖的面积 HDU - 1255 (扫描线, 面积交)
求n个矩阵面积相交的部分,和求面积并一样,不过这里需要开两个数组保存覆盖一次和覆盖两次以上的次数的部分,还是模板,主要注意点就是pushup部分,如果我已经被两次覆盖,那我的两个数组在这个root点的 ...
- 覆盖的面积 HDU - 1255(扫描线求面积交)
题意: 就是扫描线求面积交 解析: 参考求面积并.... 就是把down的判断条件改了一下..由w > 0 改为 w > 1 同时要讨论一下 == 1 时 的情况, 所以就要用到一个临时 ...
- hdu 1542/1255 Atlantis/覆盖的面积
1542 1255 两道扫描线+线段树的入门题. 基本没有什么区别,前者是模板,后者因为是求覆盖次数至少在两次以上的,这个同样是具有并集性质的,所以把cover的判断条件更改一下就可以了qwq. hd ...
- HDU 1255 覆盖的面积(线段树+扫描线)
题目地址:HDU 1255 这题跟面积并的方法非常像,仅仅只是须要再加一个变量. 刚開始我以为直接用那个变量即可,仅仅只是推断是否大于0改成推断是否大于1.可是后来发现了个问题,由于这个没有下放,没延 ...
- HDU - 1255 覆盖的面积(线段树求矩形面积交 扫描线+离散化)
链接:线段树求矩形面积并 扫描线+离散化 1.给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 2.看完线段树求矩形面积并 的方法后,再看这题,求的是矩形面积交,类同. 求面积时,用被覆 ...
- hdu 1255 覆盖的面积 (扫描线求矩形交)
覆盖的面积 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- hdu 1255 覆盖的面积(线段树 面积 交) (待整理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 Description 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. In ...
随机推荐
- vmware vSphere虚拟网络之标准交换机(二)
一.标准交换机的特点: 1)只能用于物理主机 2)其他主机不能共享同一个虚拟交换机 3)不具备任何灵活性 4)每台ESXi主机都要配置一遍 二.网络图: 三.创建标准交换机: 登录web vCente ...
- UX | 最小可行性技能
简评:本文介绍了最小 UX 需要技能(可以看成设计版 MVP),包括用不同视角看事情,从回馈中学习等等 ~ 呐,可能刚入门设计的时候,会让一堆工具弄得眼花缭乱.其实呢,并不一定要每样都会使用,举一反三 ...
- 3.1、Factorization Machine模型
Factorization Machine模型 在Logistics Regression算法的模型中使用的是特征的线性组合,最终得到的分隔超平面属于线性模型,其只能处理线性可分的二分类问题,现实生活 ...
- sqlserver 临时表,多用户同时访问冲突吗?
当然不会冲突,一个井号的临时表(本地临时表),在数据库中物理表名并非你看到的,而是系统会为你的临时表生成一个唯一的表名,所以其它用户使用和建同样的表不会发生冲突.
- CBoard 看板参数管理
看板设计采用简单Row+Column布局模式,每行总长度为12,每列对应一个图表,行高度可以调节,列高度集成行高 左边栏看板分类中,我的看板为当前用户创建的看板,普通看板分类通过分类管理维护,保存看板 ...
- Android 生成xml文件及xml的解析
1.生成xml文件的两种方式 (1)采用拼接的方式生成xml(不推荐使用) (2)利用XmlSerializer类生成xml文件 package com.example.lucky.test52xml ...
- hdu3068 最长回文 马拉车模板题
题目传送门 马拉车算法模板题. 学习博客 #include<bits/stdc++.h> #define clr(a,b) memset(a,b,sizeof(a)) using name ...
- c# 实现无符号右移
/// <summary> /// 无符号右移, 相当于java里的 value>>>pos /// </summary> /// <param nam ...
- C#.net 设置Access-Control-Allow-Origin来实现跨域
<system.webServer> <httpProtocol> <customHeaders> <add name="Access-Contro ...
- mysql命令查询表的个数
https://blog.csdn.net/xiao__ge/article/details/56671221 语句如下: SELECT count(TABLE_NAME) FROM informat ...