POJ 1151 Atlantis 线段树+扫描线

解题思路:

先将y轴进行离散化。n个矩形的2n个横边纵坐标共构成最多2n-1个区间的边界,对这些区间编号,建立起线段树。

x轴记录左边和右边,左边时是矩形面积增加,覆盖层数增加边,右边是形面积减少,覆盖层数减少边。

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <algorithm>
  4 using namespace std;
  5 double y[210];
  6 int ncount;
  7 struct line
  8 {
  9     double x,y1,y2;
 10     bool left;
 11 };
 12 line lines[210];
 13 struct node
 14 {
 15     int l,r;
 16     node *pl,*pr;
 17     double len;
 18     int c;
 19 };
 20 bool cmp(const line &a,const line &b)
 21 {
 22     return a.x<b.x;
 23 }
 24 node t[1010];
 25 void build(node *root,int l,int r)
 26 {
 27     root->l=l;
 28     root->r=r;
 29     root->c=0;
 30     root->len=0;
 31     if(l==r) return;
 32     ncount++;
 33     root->pl=t+ncount;
 34     ncount++;
 35     root->pr=t+ncount;
 36     build(root->pl,l,(l+r)/2);
 37     build(root->pr,(l+r)/2+1,r);
 38 }
 39 int searchy(int e,double x)
 40 {
 41     int s=0;
 42     e=e-1;
 43     while(s<=e)
 44     {
 45         int mid=s+(e-s)/2;
 46         if(y[mid]==x)
 47             return mid;
 48         else if(y[mid]>x)
 49             e=mid-1;
 50         else s=mid+1;
 51     }
 52     return -1;
 53 }
 54 int mid(node *p)
 55 {
 56     return (p->l+p->r)/2;
 57 }
 58 void Insert(node *root,int l,int r)
 59 {
 60     if(root->l==l&&root->r==r)
 61     {
 62         root->len=y[r+1]-y[l];
 63         root->c++;
 64         return ;
 65     }
 66     if(r<=mid(root))
 67         Insert(root->pl,l,r);
 68     else if(l>=mid(root)+1)
 69         Insert(root->pr,l,r);
 70     else
 71     {
 72         Insert(root->pl,l,mid(root));
 73         Insert(root->pr,mid(root)+1,r);
 74     }
 75     if(root->c==0)
 76         root->len=root->pl->len+root->pr->len;
 77 }
 78 void Delete(node *root,int l,int r)
 79 {
 80     if(root->l==l&&root->r==r)
 81     {
 82         root->c--;
 83         if(root->c==0)
 84         {
 85             if(root->l==root->r)
 86                 root->len=0;
 87             else
 88                 root->len=root->pl->len+root->pr->len;
 89         }
 90         return;
 91     }
 92     if(r<=mid(root))
 93         Delete(root->pl,l,r);
 94     else if(l>=mid(root)+1)
 95         Delete(root->pr,l,r);
 96     else
 97     {
 98         Delete(root->pl,l,mid(root));
 99         Delete(root->pr,mid(root)+1,r);
100     }
101     if(root->c==0)
102         root->len=root->pl->len+root->pr->len;
103 }
104 int main()
105 {
106     int n;
107     double x1,x2,y1,y2;
108     int yc,lc;
109     int ca=0;
110     while(~scanf("%d",&n)&&n)
111     {
112         ca++;
113         lc=yc=0;
114         for(int i=0; i<n; i++)
115         {
116             scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
117             y[yc++]=y1;
118             y[yc++]=y2;
119             lines[lc].x=x1;
120             lines[lc].y1=y1;
121             lines[lc].y2=y2;
122             lines[lc].left=1;
123             lc++;
124 
125             lines[lc].x=x2;
126             lines[lc].y1=y1;
127             lines[lc].y2=y2;
128             lines[lc].left=0;
129             lc++;
130         }
131         sort(y,y+yc);
132         yc=unique(y,y+yc)-y;
133         build(t,0,yc-2);
134         sort(lines,lines+lc,cmp);
135         double ans=0;
136         for(int i=0; i<lc-1; i++)
137         {
138             int l=searchy(yc,lines[i].y1);
139             int r=searchy(yc,lines[i].y2)-1;
140             if(lines[i].left)
141                 Insert(t,l,r);
142             else
143                 Delete(t,l,r);
144             ans+=t[0].len*(lines[i+1].x-lines[i].x);
145         }
146         printf("Test case #%d\n",ca);
147         printf("Total explored area: %.2f\n\n",ans);
148     }
149 }

 

转载于:https://www.cnblogs.com/kearon/p/6925546.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252593.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分页

1.首先在数据库中建立一个视图&#xff08;在aspx中sql查询语句是view_student不是student&#xff09;&#xff0c;在视图里创建create view view_student--创建视图as row_number 行号 一条数据是一行 分页功能要根据行数运算select *,row_number() over(order by stuNo desc…

NFS服务端的安装

执行以下四步操作即可完成在虚拟机上安装完成NFS的服务端&#xff1a;第一步&#xff1a;在虚拟机上安装nfs服务&#xff1a; sudo apt install nfs-kernel-server 第二步&#xff1a;修改文件 sudo vi /etc/exports 在文件末尾增加 /home/zzf/hisi-sdk 192.16…

【C++STL/红黑树】POJ 3481 DoubleQueue

POJ 3481 Double Queue 描述&#xff1a; 新成立的BIG-Bank在不切雷斯特开了一间新办公室,使用了由IBM罗马尼亚的现代计算机办公环境,运用了现代信息技术.一般来说,银行的每个顾客都有一个识别码K,并且每一个来银行的顾客都会被给予一个优先级P.银行主管的一个大胆想法震惊了公…

基础表单笔记

表单数据要向服务端提交的话 每个表单都要指定一些属性就是name""和value"" value就是用户写什么就是什么 来提交name就是对这个表单进行一个标识 <from> 输入用户名<input type"text" name"user" value""/>这…

PCIE总线-PCI、PCIE关系及信号定义

PCI(Peripheral Component Interconnect)总线规范在上世纪九十年代由Intel提出。在处理器体系结构中&#xff0c;PCI总线属于局部总线(Local Bus)。局部总线作为系统总线的延伸&#xff0c;主要功能是为了连接外部设备。 处理器主频的不断提升&#xff0c;要求速度更快&#x…

SQL Server:SQL Like 通配符特殊用法:Escape

%&#xff1a;匹配零个及多个任意字符&#xff1b; _&#xff1a;与任意单字符匹配&#xff1b; []&#xff1a;匹配一个范围&#xff1b; [^]&#xff1a;排除一个范围 &#xff1b;-&#xff1a;连字符 Symbol Meaning like 5[%] 5% like [_]n _n like [a-cdf] a, b, c, d, o…

案例篇-HBase RowKey 设计指南

1.为什么 Rowkey 这么重要 1.1 RowKey 到底是什么 我们常说看一张 HBase 表设计的好不好&#xff0c;就看它的 RowKey 设计的好不好。可见 RowKey 在 HBase 中的地位。那么 RowKey 到底是什么?RowKey 的特点 如下: 类似于 MySQL、Oracle 中的主键&#xff0c;用于标示唯一的行…

PCIe简介及引脚定义

随着现代处理器技术的发展&#xff0c;在互连领域中&#xff0c;使用高速差分总线替代并行总线是大势所趋。与单端并行信号相比&#xff0c;高速差分信号可以使用更高的时钟频率&#xff0c;从而使用更少的信号线&#xff0c;完成之前需要许多单端并行数据信号才能达到的总线带…

IDEA下搜狗输入法输入中文时卡着不动的参考解决方法

【问题描述】 在IntelliJ IDEA工具的java编辑窗口&#xff0c;给代码增加注释时发现&#xff0c;输入中文时&#xff0c;搜狗输入法界面不动&#xff0c;只显示第一个字母。如图&#xff1a; 我想输入“根据”两个字&#xff0c;但搜狗输入法界面一直卡着不刷新&#xff0c;导…

6U VPX板卡资料:6U VPX 高性能计算存储板卡

6U VPX板卡资料&#xff1a;6U VPX 高性能计算存储板卡_hexiaoyan827的博客-CSDN博客_vpx板卡

Android: Custom View和include标签的区别

Custom View&#xff0c; 使用的时候是这样的&#xff1a; <com.example.home.alltest.view.MyCustomViewandroid:id"id/customView"android:layout_width"match_parent"android:layout_height"wrap_content"></com.example.home.allte…

七 web爬虫讲解2—urllib库爬虫—状态吗—异常处理—浏览器伪装技术、设置用户代理...

如果爬虫没有异常处理&#xff0c;那么爬行中一旦出现错误&#xff0c;程序将崩溃停止工作&#xff0c;有异常处理即使出现错误也能继续执行下去 1.常见状态吗 301&#xff1a;重定向到新的URL&#xff0c;永久性302&#xff1a;重定向到临时URL&#xff0c;非永久性304&#x…

DVI和HDMI中的TMDS接口协议

TMDS&#xff08;Transition Minimized Differential signal&#xff09;&#xff0c;即过渡调制差分信号&#xff0c;也被称为最小化传输差分信号&#xff0c;是指通过异或及异或非等逻辑算法将原始信号数据转换成10位&#xff0c;前8为数据由原始信号经运算后获得&#xff0c…

君子眼中皆好人

从前有个国王&#xff0c;在晚年时思量 着&#xff1a;“我有两个儿子&#xff0c;我应该把王位传给哪个儿子来统治这个国家呢&#xff1f;”国王决定考验一下他的两位王子&#xff0c;哪位最是忠义仁厚&#xff0c;爱护老百姓的明君。国王叫来长子&#xff0c; 对他说&#xf…

GS使用HTTPS登录的设置过程

1. Windows 增加角色服务 服务器配置管理器&#xff0c; 添加角色服务 增加角色功能里面有&#xff1a; 证书颁发机构 证书颁发机构 web注册 2. AD CS配置 主要是next操作 独立ca 根证书 等 3. inetmgr申请证书 在机器名的一层及上面申请证书 保存证书信息 用来使用CA机构进行签…

TMDS的信号通道

1 TMDS的信号通道&#xff1a; 1个HDMI包括3个TMDS数据通道和1个TMDS时钟通道。 . 每一个TMDS时钟周期内&#xff0c;TMDS数据通道上会发送一个10位的字符信息&#xff1b; . 每个TMDS时钟周期内&#xff0c;编码器将2位的控制数据、4位的报数据或者8位的视频数据采取不同 …

[luoguP2774] 方格取数问题(最大点权独立集)

传送门 引入两个概念&#xff1a; 最小点权覆盖集&#xff1a;满足每一条边的两个端点至少选一个的最小权点集。 最大点权独立集&#xff1a;满足每一条边的两个端点最多选一个的最大权点集。 现在对网格染色&#xff0c;使得相邻两点颜色不同&#xff0c;之后把两个颜色的点分…

docker入门之容器网络

docker入门之容器网络首发&#xff1a;arppinging.com一、网络命名空间1&#xff09;IP命令2&#xff09;实例二、网络模型三、容器中常见的网络操作1&#xff09;指定网络模式2&#xff09;指定容器的dns地址和hosts解析四、网桥配置一、网络命名空间1&#xff09;IP命令查看i…

光谱分布、光谱辐射通量密度与不同时间段分布光谱(图示)

1、光谱分布图 2 太阳辐射能量图 3、不同时间段的太阳分布光谱图 4、不同波长的光的能量分布主要区域 5、不同波段的使用场景

$.ajax()方法详解

相关链接&#xff1a;http://blog.csdn.net/denghejing/article/details/41087581转载于:https://www.cnblogs.com/Steven5007/p/8191275.html