【luoguP1382】楼房
离散化,线段树维护区间修改,发现询问都是单点的\(max\),不妨把标记留在点上,不用下传,查询时取个\(max\)就可以了
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
#define lc (p<<1)
#define rc (p<<1|1)
using namespace std;
const int MAXN=400010;
const int MAXM=1600010;
inline int read(){
int x=0,f=1; char c=getchar();
while(c<'0'){ if(c=='-') f=-1; c=getchar(); }
while(c>='0') x=x*10+c-'0',c=getchar();
return x*f;
}
int n,x[MAXN],cnt,num;
struct Data{
int l,r,h;
} a[MAXN];
map<int,int> Map;
int tree[MAXM],rev[MAXN];
inline void update(int L,int R,int h,int p=1,int l=1,int r=num){
if(L<=l&&r<=R){
tree[p]=max(tree[p],h);
return;
}
int mid=(l+r)>>1;
if(L<=mid) update(L,R,h,lc,l,mid);
if(R>mid) update(L,R,h,rc,mid+1,r);
}
inline int query(int x,int p=1,int l=1,int r=num){
if(l==r) return tree[p];
int mid=(l+r)>>1,ans=tree[p];
if(x<=mid) ans=max(ans,query(x,lc,l,mid));
else ans=max(ans,query(x,rc,mid+1,r));
return ans;
}
inline bool cmp(Data x,Data y){
if(x.l!=y.l)
return x.l<y.l;
return x.r<y.r;
}
int ansx[MAXN],ansy[MAXN],ansnum;
int main(){
n=read();
for(int i=1;i<=n;++i)
a[i].h=read(),a[i].l=read(),a[i].r=read(),--a[i].r;
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;++i){
x[++cnt]=a[i].l;
x[++cnt]=a[i].l+1;
x[++cnt]=a[i].r;
x[++cnt]=a[i].r+1;
}
x[0]=x[1]-1;
sort(x+1,x+1+cnt);
for(int i=1;i<=cnt;++i)
if(x[i]!=x[i-1]) Map[x[i]]=++num,rev[num]=x[i];
++num;
for(int i=1;i<=n;++i)
update(Map[a[i].l],Map[a[i].r],a[i].h);
int last=0;
for(int i=1;i<=num;++i){
int tmp=query(i);
if(tmp!=last){
if(tmp>last){
ansx[++ansnum]=rev[i],ansy[ansnum]=last;
ansx[++ansnum]=rev[i],ansy[ansnum]=tmp;
}
else{
ansx[++ansnum]=rev[i-1]+1,ansy[ansnum]=last;
ansx[++ansnum]=rev[i-1]+1,ansy[ansnum]=tmp;
}
last=tmp;
}
}
printf("%d\n",ansnum);
for(int i=1;i<=ansnum;++i)
printf("%d %d\n",ansx[i],ansy[i]);
return 0;
}
【luoguP1382】楼房的更多相关文章
- AC日记——楼房 codevs 2995
2995 楼房 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 地平线(x轴)上有n个矩(lou ...
- Bzoj2957 楼房重建
Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1516 Solved: 723[Submit][Status][Discuss] Descripti ...
- 【清华集训】楼房重建 BZOJ 2957
Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
- 扫描线+堆 codevs 2995 楼房
2995 楼房 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 地平线(x轴)上有n个矩(lou)形(fan ...
- BZOJ 2957 楼房重建
Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
- [BZOJ 2957]楼房重建(THU2013集训)(分块思想)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2957 分析: 首先明确问题,对于每栋楼房的斜率K=H/X,问题就是问有多少个楼房的K比前面所有 ...
- bzoj 2957: 楼房重建 线段树
2957: 楼房重建 Time Limit: 10 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description 小A的楼房外有一大片施 ...
- [bzoj2957][楼房重建] (线段树)
Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
- 【题解】Luogu P4198 楼房重建
原题传送门 根据斜率来建线段树,线段树维护区间最大斜率以及区间内能看见的楼房的数量(不考虑其他地方的原因,两个节点合并时再考虑) 细节见程序 #include <bits/stdc++.h> ...
随机推荐
- 详解XOR(异或)运算加密
逻辑运算之中,除了 AND 和 OR,还有一种 XOR 运算,中文称为"异或运算".它的定义是:两个值相同时,返回false,否则返回true.也就是说,XOR可以用来判断两个值是 ...
- python3.7环境安装
wget http://mirror.centos.org/centos/6/os/x86_64/Packages/libffi-devel-3.0.5-3.2.el6.x86_64.rpm rpm ...
- golang --strings 下常用函数api
1. func Compare(a, b string) int {} 比较返回一个按字典顺序比较两个字符串的整数.如果a == b则结果为0,如果a <b则结果为-1,如果a> b则结果 ...
- 【Python3爬虫】最新的12306爬虫
一.写在前面 我在以前写过一次12306网站的爬虫,当时实现了模拟登录和查询车票,但是感觉还不太够,所以对之前的代码加以修改,还实现了一个订购车票的功能. 二.主要思路 在使用Selenium做模拟登 ...
- Docker 快速安装&搭建 MongDB 环境
欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 高级架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...
- css3贝塞尔曲线过渡动画速率——transition-timing-function:cubic-bezier(n,n,n,n)
css3过渡动画速率用到的是三阶贝塞尔曲线,曲线有四个点,p0,p1,p2,p3 有几个属性: linear 规定以相同速度开始至结束的过渡效果(等于 cubic-bezier(0,0,1,1)). ...
- wcf序列化嵌套类(如TreeNode)异常原因
循环引用类在WCF中的传递 循环引用类在WCF中的传递问题,例如: [DataContract] public class AB { public string name { ...
- 离散数学交并补运算、差运算、异或运算的实现--biaobiao88
对集合的交并补运算.差运算及异或运算的代码,可输入字符与数字,内容简单,详情请看以下代码 #include<iostream> using namespace std; int main( ...
- G++命令
gcc and g++分别是gnu的c & c++编译器. 从源代码到可执行文件的四步 gcc/g++在执行编译工作的时候,总共需要4步 1.预处理,生成.i的文件,用到预处理器cpp.这一步 ...
- 在centos下安装rar解压.rar压缩包
CentOS本身不自带rar环境,因此对于rar文件无法直接解压,需要先配置rar环境. 首先需要确定自己的系统是64位还是32位的,通过这个命令: [root@localhost]# uname - ...