[题目] luogu P2061 [USACO07OPEN]城市的地平线City Horizon
算法
线段树 + 离散化
思路
对\((x,y,h)\)的左右端点\(x,y\)进行离散化,离散化前的原值记为\(val[i]\),对每个矩形按高度\(h\)从小到大排序。

设离散化后的端点有\(M\)个,则对如图所示\(M-1\)个规则矩形编号为\([1,M-1]\),可以由\(h_{[i, i+1]}\times(val[i+1] - val[i])\)得出第\(i\)个矩形的面积。
开一颗区间为\([1,M-1]\)的线段树,按\(h\)从小到大依次对线段树区间覆盖,可以保证高的矩形覆盖了低的矩形的区间,具体操作为对离散化后的\((x,y,h)\),进行线段树\([x,y-1]\)区间覆盖\(h\)值,最终\(i\)点存储\(h_{[i,i+1]}\)的最大值。
\(h_{[i, i+1]}\)可以通过线段树单点查询\(i\)点求出。
答案:\(\sum_{i=1}^{M-1}h_{[i, i+1]}\times(val[i+1] - val[i])\)
代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#define ll long long
using namespace std;
const int N = 80005;
int n, b[N], val[N];//b[]:离散化数组
struct Line { int x, y, h; }a[N];//存储每个矩形
bool cmp(Line a, Line b) { return a.h < b.h; }
int ans[N << 2];//线段树数组
#define ls (p << 1)
#define rs (p << 1 | 1)
#define mid ((l + r) >> 1)
void update(int p, int l, int r, int ul, int ur, int k)
{
if(ul <= l && r <= ur) { ans[p] = k; return; }
if(ans[p]) ans[ls] = ans[rs] = ans[p], ans[p] = 0;//区间覆盖直接下推
if(ul <= mid) update(ls, l, mid, ul, ur, k);
if(ur > mid) update(rs, mid + 1, r, ul, ur, k);
}
ll query(int p, int l, int r, int x)//单点查询
{
if(l == r) return ans[p];
if(ans[p]) ans[ls] = ans[rs] = ans[p], ans[p] = 0;//区间覆盖直接下推
if(x <= mid) return query(ls, l, mid, x);
if(x > mid) return query(rs, mid + 1, r, x);
}
#undef ls
#undef rs
#undef mid
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; i++)
{
scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].h);
b[i] = a[i].x; b[n + i] = a[i].y;//离散化数组记录下所有x,y
}
sort(b + 1, b + 2 * n + 1);//排序
int _n = unique(b + 1, b + 2 * n + 1) - (b + 1);//去重,_n为去重后x,y端点个数
for(int i = 1; i <= n; i++)
if(a[i].x != a[i].y)//x=y没有作用
{
int x = a[i].x, y = a[i].y;
a[i].x = lower_bound(b + 1, b + _n + 1, a[i].x) - b;
a[i].y = lower_bound(b + 1, b + _n + 1, a[i].y) - b;//离散化
val[a[i].x] = x; val[a[i].y] = y;//原值
}
sort(a + 1, a + n + 1, cmp);//按h从小到大排序
for(int i = 1; i <= n; i++)
if(a[i].x != a[i].y)//防止y-1<x
update(1, 1, _n - 1, a[i].x, a[i].y - 1, a[i].h);//更新,注意结点个数是_n-1,端点y要变成矩形区域y-1,可以画图理解一下,相当于把端点x右边的矩形区域编号为x
ll res = 0;
for(int i = 1; i < _n; i++)
res += query(1, 1, _n - 1, i) * (val[i + 1] - val[i]);
printf("%lld\n", res);
return 0;
}
[题目] luogu P2061 [USACO07OPEN]城市的地平线City Horizon的更多相关文章
- bzoj1645 / P2061 [USACO07OPEN]城市的地平线City Horizon(扫描线)
P2061 [USACO07OPEN]城市的地平线City Horizon 扫描线 扫描线简化版 流程(本题为例): 把一个矩形用两条线段(底端点的坐标,向上长度,添加$or$删除)表示,按横坐标排序 ...
- 洛谷 P2061 [USACO07OPEN]城市的地平线City Horizon
简化版的矩形面积并,不用线段树,不用离散化,代码意外的简单 扫描线,这里的基本思路就是把要求的图形竖着切几刀分成许多矩形,求面积并.(切法就是每出现一条与y轴平行的线段都切一刀) 对于每一个切出来的矩 ...
- Luogu_2061_[USACO07OPEN]城市的地平线City Horizon
题目描述 Farmer John has taken his cows on a trip to the city! As the sun sets, the cows gaze at the cit ...
- 线段树+扫描线【bzoj1645】[USACO07OPEN]城市的地平线City Horizon
Description 约翰带着奶牛去都市观光.在落日的余晖里,他们看到了一幢接一幢的摩天高楼的轮廓在地平线 上形成美丽的图案.以地平线为 X 轴,每幢高楼的轮廓是一个位于地平线上的矩形,彼此间可能有 ...
- 1645: [Usaco2007 Open]City Horizon 城市地平线
1645: [Usaco2007 Open]City Horizon 城市地平线 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 315 Solved: ...
- BZOJ_1654_[Usaco2007 Open]City Horizon 城市地平线_扫描线
BZOJ_1654_[Usaco2007 Open]City Horizon 城市地平线_扫描线 Description N个矩形块,交求面积并. Input * Line 1: A single i ...
- 【BZOJ1645】[Usaco2007 Open]City Horizon 城市地平线 离散化+线段树
[BZOJ1645][Usaco2007 Open]City Horizon 城市地平线 Description Farmer John has taken his cows on a trip to ...
- bzoj1645 [Usaco2007 Open]City Horizon 城市地平线
Description Farmer John has taken his cows on a trip to the city! As the sun sets, the cows gaze at ...
- 【BZOJ】1645: [Usaco2007 Open]City Horizon 城市地平线(线段树+特殊的技巧)
http://www.lydsy.com/JudgeOnline/problem.php?id=1645 这题的方法很奇妙啊...一开始我打了一个“离散”后的线段树.............果然爆了. ...
随机推荐
- PXE | 开关机
PXE | 开关机流程 linuxPXE 主要阶段 引导的主要6个阶段 从MBR中读取引导加载程序boot loader 加载并初始化内核: 检测和配置设备: 创建内核进程: 系统管理员干预(单用户模 ...
- IDEA操作技巧与Tomcat集成
一.Tomcat Tomcat是基于Java的一个开放源代码.运行servlet和JSP Web应用的Web应用软件容器.Tomcat是Apache软件基金会(Apache Software Foun ...
- 【Ueditor】富文本编辑使用
前提准备: 在http://ueditor.baidu.com/website/官网下载需要使用的版本.(我选用的1.4.3.1最新版本)因为这是以前做过的一个记录,现在移动到博客园保存记录.所有现在 ...
- 【Spring】30、Spring,SpringMVC用法汇总
SpringMVC的工作原理图: springMVC中的几个组件: 前端控制器(DispatcherServlet):接收请求,响应结果,相当于电脑的CPU. 处理器映射器(HandlerMappin ...
- CSS常见布局
一.单列布局 1. 水平居中 1.1 使用inline-block和text-align .parent{text-align:center;} .child{display:inline-block ...
- docker 安装jenkins
基于docker 进行安装 软件,首先需要有docker环境. 1.docker 下载 jenkins 镜像 指定版本 ,因为低版本的后面安装 软件会失败(亲测). docker pull jenki ...
- 谈谈web上各种图片应用的优缺点
web中承载信息的主要方式就是图片与文字了,以下就是对一些web图片格式的优缺点进行归纳. 1.GIF GIF图是比较古老的web图片格式之一,可以追溯到1987,几乎所有的浏览器都支持这一种格式,老 ...
- OSGI企业应用开发(十四)整合Spring、Mybatis、Spring MVC
作为一个企业级的Web应用,MVC框架是必不可少的.Spring MVC目前使用也比较广泛,本文就来介绍一下如何在OSGI应用中实现Spring.Mybatis.Spring MVC框架的整合,其中S ...
- JSP内置对象——pageContext对象和config对象
它对应的常用方法有: 现在,我新建一个“pageContext.jsp”页面,可以获得“session_page1.jsp”这个页面中保存的用户名: pageContext.jap: session_ ...
- spring容器、BeanFactory、ApplicatContext、WebApplicationContext
1.spring容器 BeanFactory提供了IoC的功能:ApplicatContext建立在BeanFactory的基础上 在初始化BeanFactory的实现类时,并没有实例化Bean,直到 ...