覆盖的面积

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4040    Accepted Submission(s): 1995

Problem Description
给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积.

 
Input

入数据的第一行是一个正整数T(1<=T<=100),代表测试数据的数量.每个测试数据的第一行是一个正整数N(1<=N&
lt;=1000),代表矩形的数量,然后是N行数据,每一行包含四个浮点数,代表平面上的一个矩形的左上角坐标和右下角坐标,矩形的上下边和X轴平行,
左右边和Y轴平行.坐标的范围从0到100000.

注意:本题的输入数据较多,推荐使用scanf读入数据.

 
Output
对于每组测试数据,请计算出被这些矩形覆盖过至少两次的区域的面积.结果保留两位小数.
 
Sample Input
2
 
5
1 1 4 2
1 3 3 7
2 1.5 5 4.5
3.5 1.25 7.5 4
6 3 10 7
 
3
0 0 1 1
1 0 2 1
2 0 3 1
 
Sample Output
7.63
0.00
 
 
交G++迷之WA。。无语
C++可过。
 
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <map>
using namespace std;
#define root 1,(n<<1)+10,1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define lr rt<<1
#define rr rt<<1|1 const int N = ; struct Point {
double x , y1 , y2 ;
int v ;
bool operator < ( const Point &a ) const {
return x < a.x ;
}
}p[N];
int n , tot , tt ;
vector<double>e;
double c[N<<] ; void addpoint( double x , double y1 , double y2 , int v ) {
p[tot].x = x , p[tot].y1 = y1 , p[tot].y2 = y2 , p[tot].v = v , tot++ ;
}
map<double,int>mp; void lisan() {
mp.clear();
sort( e.begin() , e.end() ) ;
tt = ;
for( int i = ; i < e.size() ; ++i ) {
if( e[i] != e[i-] ) e[tt++] = e[i] ;
}
for( int i = ; i < tt ; ++i ) {
c[i+] = e[i] ;
mp[e[i]] = i+ ;
}
} int cnt[N<<] , lazy[N<<] ; double date[N<<] ; void build( int l , int r , int rt ) {
cnt[rt] = lazy[rt] = ;
if( l == r ) {
date[rt] = c[l+] - c[l];
return ;
}
int mid = (l+r)>>;
build(lson) , build(rson) ;
date[rt] = date[lr] + date[rr];
} void Down( int rt ) {
if( lazy[rt] ) {
cnt[lr] += lazy[rt] ;
cnt[rr] += lazy[rt] ;
lazy[lr] += lazy[rt] ;
lazy[rr] += lazy[rt] ;
lazy[rt] = ;
}
} void Up( int rt ) {
cnt[rt] = min( cnt[lr] , cnt[rr] );
} void update( int l , int r , int rt , int L , int R , int v ) {
if( l == L && r == R ) {
cnt[rt] += v ; lazy[rt] += v ;
return ;
}
int mid = (l+r)>> ;
Down(rt) ;
if( R <= mid ) update(lson,L,R,v) ;
else if( L > mid ) update( rson,L,R,v);
else update(lson,L,mid,v),update(rson,mid+,R,v);
Up(rt);
} double query( int l , int r , int rt , int L , int R ) {
if( cnt[rt] > ) return date[rt] ;
if( l == r ) return ;
Down(rt);
int mid = (l+r)>>;
if( R <= mid ) return query(lson,L,R);
else if( L > mid ) return query(rson,L,R);
else return query(lson,L,mid) + query(rson,mid+,R);
} int main() {
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif // LOCAL
int _ ; scanf("%d",&_);
while( _-- ) {
scanf("%d",&n);
e.clear();
tot = ;
for( int i = ; i < n ; ++i ) {
double x1 , y1 , x2 , y2 ;
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
if( y1 > y2 ) swap( y1 , y2 ) ;
addpoint( x1 , y1 , y2 , );
addpoint( x2 , y1 , y2 , - );
e.push_back(y1);
e.push_back(y2);
}
lisan();
sort( p , p + tot ) ;
build(,tt-,);
double ans = ;
update(,tt-,,mp[p[].y1],mp[p[].y2]-,p[].v);
for( int i = ; i < tot ; ++i ) {
ans += ( p[i].x - p[i-].x ) * query(,tt-,,,tt-) ;
update(,tt-,,mp[p[i].y1],mp[p[i].y2]-,p[i].v);
}
printf("%.2lf\n",ans);
}
return ;
}

HDU 1255 覆盖的面积 ( 扫描线 + 离散 求矩阵大于k次面积并 )的更多相关文章

  1. FZU 2187 回家种地 ( 扫描线 + 离散 求矩阵单次覆盖面积 )

    2187 回家种地 Accept: 56    Submit: 230Time Limit: 1000 mSec    Memory Limit : 32768 KB Problem Descript ...

  2. HDU 4417 Super Mario(划分树问题求不大于k的数有多少)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. HDU - 1255 覆盖的面积(线段树求矩形面积交 扫描线+离散化)

    链接:线段树求矩形面积并 扫描线+离散化 1.给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 2.看完线段树求矩形面积并 的方法后,再看这题,求的是矩形面积交,类同. 求面积时,用被覆 ...

  4. hdu 1255 覆盖的面积(求覆盖至少两次以上的面积)

    了校赛,还有什么途径可以申请加入ACM校队?  覆盖的面积 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  5. hdu 1255 覆盖的面积(线段树 面积 交) (待整理)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 Description 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积.   In ...

  6. HDU 1255 覆盖的面积 (线段树扫描线+面积交)

    自己YY了一个的写法,不过时间复杂度太高了,网上的想法太6了  题意:给你一些矩阵,求出矩阵的面积并 首先按照x轴离散化线段到线段树上(因为是找连续区间,所以段建树更加好做). 然后我们可以想一下怎样 ...

  7. HDU 1255 覆盖的面积(线段树+扫描线)

    题目地址:HDU 1255 这题跟面积并的方法非常像,仅仅只是须要再加一个变量. 刚開始我以为直接用那个变量即可,仅仅只是推断是否大于0改成推断是否大于1.可是后来发现了个问题,由于这个没有下放,没延 ...

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

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

  9. hdu 1255 覆盖的面积 (线段树处理面积覆盖问题(模板))

    http://acm.hdu.edu.cn/showproblem.php?pid=1255 覆盖的面积 Time Limit: 10000/5000 MS (Java/Others)    Memo ...

随机推荐

  1. Linux就该这么学04学习笔记

    今天开始学习,开始做笔记,希望自己能坚持下去 参考链接:https://www.linuxprobe.com/chapter-04.html vim编辑器 Linux系统中通用的文本编辑器 vi的升级 ...

  2. 05XML

    1.XML入门 1.1 引入 HTML, 超文本标记语言. html语言语法是很松散的! 1)标签不区分大小写的! 2)标签可以不匹配的. 由w3c组织,针对html的语法缺陷,去设计了另一门,叫xm ...

  3. pwd 显示当前所在的工作路径

    1.功能说明 pwd命令是“print working directory ”首字母缩写,显示当前目录的绝对路径. 2.语法格式 pwd [option] pwd 选项 3.命令参数 参数 参数说明 ...

  4. Codeforces 1215E 状压DP

    题意:给你一个序列,你可以交换序列中的相邻的两个元素,问最少需要交换多少次可以让这个序列变成若干个极大的颜色相同的子段. 思路:由于题目中的颜色种类很少,考虑状压DP.设dp[mask]为把mask为 ...

  5. 为什么有线宽带提供商获得ASN非常重要?

    光纤和同轴电缆的组合(数据有线电视服务接口规范),由此产生的网络在世界引入了高速互联网接入.我们能够从网络运营中心向家庭用户提供10Mbps的下载速度. 拥有自己的自治系统编号(ASN)和IP块意味着 ...

  6. Redis基础系列-安装启动

    安装 ①将Redis 的tar 包上传到opt 目录②解压缩③安装gcc 环境我们需要将源码编译后再安装,因此需要安装c 语言的编译环境!不能直接make! 可以上网,yum install –y g ...

  7. Android之SAX解析笔记

    books.xml: <?xml version="1.0" encoding="utf-8"?> <books> <book i ...

  8. Android9.0特性

    这篇文章,是Android官方文档的中文版本. 注意事项(AndroidP 特性): (1),android.os.Build.VERSION.RELEASE ,需要当做字符串类型处理. (2),依赖 ...

  9. 现在的编辑器不能复制粘贴word中的文本

    我司需要做一个需求,就是使用富文本编辑器时,不要以上传附件的形式上传图片,而是以复制粘贴的形式上传图片. 在网上找了一下,有一个插件支持这个功能. WordPaster 安装方式如下: 直接使用Wor ...

  10. 【转】excel音标乱码

    源地址:https://zhidao.baidu.com/question/204553900.html 百度一个音标字体文件,下载后再拷贝到C:\WINDOWS\FONTS目录下面就可以了 下载地址 ...