POJ1151Atlantis 矩形面积并[线段树 离散化 扫描线]
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 21734 | Accepted: 8179 |
Description
Input
The input file is terminated by a line containing a single 0. Don't process it.
Output
Output a blank line after each test case.
Sample Input
- 2
- 10 10 20 20
- 15 15 25 25.5
- 0
Sample Output
- Test case #1
- Total explored area: 180.00
Source
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #include <map>
- using namespace std;
- const int N=;
- #define m (l+r)/2
- #define lson o<<1,l,m
- #define rson o<<1|1,m+1,r
- #define lc o<<1
- #define rc o<<1|1
- inline int read(){
- char c=getchar();int x=,f=;
- while(c<''||c>''){if(c=='-')f=-;c=getchar();}
- while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
- return x*f;
- }
- int n,cnt=;
- double x1,y1,x2,y2,mp[N];
- struct seg{
- double l,r,h;
- int f;//1 or -1
- seg(double a=,double b=,double c=,int d=):l(a),r(b),h(c),f(d){}
- bool operator <(const seg &r)const{return h<r.h;}
- }a[N];
- struct node{
- double sum;
- int cov;
- }t[N<<];
- inline int Bin(double v){
- int l=,r=cnt;
- while(l<=r){
- int mid=(l+r)>>;
- if(mp[mid]==v) return mid;
- else if(v<mp[mid]) r=mid-;
- else l=mid+;
- }
- return -;
- }
- inline void pushUp(int o,int l,int r){
- if(t[o].cov) t[o].sum=mp[r+]-mp[l];
- else if(l==r) t[o].sum=;
- else t[o].sum=t[lc].sum+t[rc].sum;
- }
- void update(int o,int l,int r,int ql,int qr,int v){
- if(ql<=l&&r<=qr){
- t[o].cov+=v;
- pushUp(o,l,r);
- }else{
- if(ql<=m) update(lson,ql,qr,v);
- if(m<qr) update(rson,ql,qr,v);
- pushUp(o,l,r);
- }
- }
- int cas=;
- int main(int argc, const char * argv[]) {
- while((n=read())){
- double ans=;
- for(int i=;i<=n;i++){
- scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
- a[i*-]=seg(x1,x2,y1,);
- a[i*]=seg(x1,x2,y2,-);
- mp[*i-]=x1;
- mp[*i]=x2;
- }
- sort(mp+,mp++*n);
- sort(a+,a++*n);
- cnt=;mp[++cnt]=mp[];
- for(int i=;i<=*n;i++)
- if(mp[i]!=mp[i-]) mp[++cnt]=mp[i];
- memset(t,,sizeof(t));
- for(int i=;i<=*n-;i++){//最后一个不用
- int ql=Bin(a[i].l),qr=Bin(a[i].r)-;
- if(ql<=qr) update(,,cnt,ql,qr,a[i].f);
- ans+=t[].sum*(a[i+].h-a[i].h);
- }
- printf("Test case #%d\n",++cas);
- printf("Total explored area: %.2f\n\n",ans);
- }
- return ;
- }
线段树需要插入线段,删除线段,求线段覆盖的总长度,貌似还是用标记永久化比较方便,否则删(我)除(没)很(写)麻(出)烦(来)
注意这个线段树节点是一段区间哦
离散化m忘清0了 WA了几次
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #include <map>
- using namespace std;
- const int N=;
- #define lson x<<1,l,mid
- #define rson x<<1|1,mid+1,r
- #define lc x<<1
- #define rc x<<1|1
- inline int read(){
- char c=getchar();int x=,f=;
- while(c<''||c>''){if(c=='-')f=-;c=getchar();}
- while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
- return x*f;
- }
- int n;
- double x1,y1,x2,y2;
- struct Seg{
- double l,r,y;
- int f;
- Seg(double l=,double r=,double y=,int f=):l(l),r(r),y(y),f(f){}
- bool operator <(const Seg &a)const{return y<a.y;}
- }a[N];
- double mp[N];int m;
- void iniMP(){
- sort(mp+,mp++m);
- int p=;
- mp[++p]=mp[];
- for(int i=;i<=m;i++) if(mp[i]!=mp[i-]) mp[++p]=mp[i];
- m=p;
- }
- inline int Bin(double v){
- int l=,r=m;
- while(l<=r){
- int mid=(l+r)>>;
- if(v==mp[mid]) return mid;
- else if(v<mp[mid]) r=mid-;
- else l=mid+;
- }
- return ;
- }
- struct node{
- double sum;
- int cov;
- node():sum(),cov(){}
- }t[N<<];
- void pushUp(int x,int l,int r){
- if(t[x].cov) t[x].sum=mp[r+]-mp[l];
- else if(l==r) t[x].sum=;
- else t[x].sum=t[lc].sum+t[rc].sum;
- }
- void segCov(int x,int l,int r,int ql,int qr,int v){
- if(ql<=l&&r<=qr) t[x].cov+=v,pushUp(x,l,r);
- else{
- int mid=(l+r)>>;
- if(ql<=mid) segCov(lson,ql,qr,v);
- if(mid<qr) segCov(rson,ql,qr,v);
- pushUp(x,l,r);
- }
- }
- int cas=;
- int main(int argc, const char * argv[]) {
- while((n=read())){
- m=;
- for(int i=;i<=n;i++){
- scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
- a[i*-]=Seg(x1,x2,y1,);
- a[i*]=Seg(x1,x2,y2,-);
- mp[++m]=x1;mp[++m]=x2;
- }
- iniMP();
- n<<=;
- sort(a+,a++n);
- memset(t,,sizeof(t));
- double ans=;
- for(int i=;i<=n-;i++){
- int ql=Bin(a[i].l),qr=Bin(a[i].r)-;
- if(ql<=qr) segCov(,,m,ql,qr,a[i].f);
- ans+=t[].sum*(a[i+].y-a[i].y);
- }
- printf("Test case #%d\n",++cas);
- printf("Total explored area: %.2f\n\n",ans);
- }
- return ;
- }
POJ1151Atlantis 矩形面积并[线段树 离散化 扫描线]的更多相关文章
- POJ 1151Atlantis 矩形面积并[线段树 离散化 扫描线]
Atlantis Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 21734 Accepted: 8179 Descrip ...
- hdu1542 矩形面积并(线段树+离散化+扫描线)
题意: 给你n个矩形,输入每个矩形的左上角坐标和右下角坐标. 然后求矩形的总面积.(矩形可能相交). 题解: 前言: 先说说做这道题的感受: 刚看到这道题顿时就懵逼了,几何 烂的渣渣.后来从网上搜题解 ...
- poj-1151矩形面积并-线段树
title: poj-1151矩形面积并-线段树 date: 2018-10-30 22:35:11 tags: acm 刷题 categoties: ACM-线段树 概述 线段树问题里的另一个问题, ...
- 【POJ 2482】 Stars in Your Window(线段树+离散化+扫描线)
[POJ 2482] Stars in Your Window(线段树+离散化+扫描线) Time Limit: 1000MS Memory Limit: 65536K Total Submiss ...
- HDU1542 Atlantis —— 求矩形面积并 线段树 + 扫描线 + 离散化
题目链接:https://vjudge.net/problem/HDU-1542 There are several ancient Greek texts that contain descript ...
- Codeforces 610D Vika and Segments 线段树+离散化+扫描线
可以转变成上一题(hdu1542)的形式,把每条线段变成宽为1的矩形,求矩形面积并 要注意的就是转化为右下角的点需要x+1,y-1,画一条线就能看出来了 #include<bits/stdc++ ...
- POJ 1177/HDU 1828 picture 线段树+离散化+扫描线 轮廓周长计算
求n个图矩形放下来,有的重合有些重合一部分有些没重合,求最后总的不规则图型的轮廓长度. 我的做法是对x进行一遍扫描线,再对y做一遍同样的扫描线,相加即可.因为最后的轮廓必定是由不重合的线段长度组成的, ...
- hdu1542线段树+离散化+扫描线
参考博客: http://blog.csdn.net/xingyeyongheng/article/details/8927732 总的来说就是用一条(假想的)线段去平行x轴从下往上扫描,扫描的过程中 ...
- Picture POJ - 1177 线段树+离散化+扫描线 求交叉图像周长
参考 https://www.cnblogs.com/null00/archive/2012/04/22/2464876.html #include <stdio.h> #include ...
随机推荐
- 【开发软件】推荐一款MAC OS X 下php集成开发环境mamp
这里给大家推荐一款在mac上搭建WEB服务器环境的集成环境安装软件,非常的好用,需要的朋友可以拿去,不用谢 ^_^ 之前苦于mac上搭建本地服务器之艰辛,找寻好久都没找到一款类似windows ...
- 使用jenkins配置.net mvc网站进行持续集成一
最近好久没有更新文章了,因为好久没有写代码了,以至于我不知道同大家分享些什么,刚好,今天突然叫我学习下jenkins每日构建,我就把今天的学习笔记记录下来,这其中很多东西都是公司同事之前调研总结的,我 ...
- GJM:Unity导入百度地图SDK [转载]
感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...
- 从CSS实现正片叠底看=>混合模式mix-blend-mode
兼容性:这个东西说多了也没意思,像HTML5和CSS3这种兼容性时刻变化的东东,我们最好在自己支持的设备上实验,不支持,就在想办法呗,这个东西就是为了方便和好玩 所有属性: mix-blend-mod ...
- 使用原生JS实现一个风箱式的demo,并封装了一个运动框架
声明,该DEMO依托于某个培训机构中,非常感谢这个培训结构.话不多说,现在开始改demo的制作. 首先,在前端的学习过程中,轮播图是我们一定要学习的,所以为了更加高效的实现各种轮播图,封装了一个运动的 ...
- 移动AD的计算机到对应的OU的powershell脚本
#//************************************************************* #//编辑人: #//编辑单位: #//编辑作用:移动计算机到对应的O ...
- UITextView 开始编辑时,文字没有左上角对齐解决办法 tableview整体上移
现实情况如上所示 我出现这种情况的原因有两种: 其一:没有给textview对齐方式: 其二:没有将BOOL类型的“ automaticallyAdjustsScrollViewInsets ”属性置 ...
- Servlet的生命周期+实现方式
1.Servlet的生命周期: (1)被创建: 默认情况下,Servlet第一次被访问时,被服务器创建.会调用init()方法. 一个 ...
- iOS 学习 - 19 结构体
//创建新类型typedef struct { int age; ];//最大字节为 20 }Student; Student value2 = {,*strcpy(value2.name, &quo ...
- 关于Ruby常用语法案例累积
变量问题: 类变量和方法变量的区别是什么? 类变量:可以直接使用 方法变量:需要实例化后,才能使用该变量 案例一: class Person @@name = "Tom" @@na ...