/*暴力30分*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
#define maxn 100010
using namespace std;
int n,l=0x7fffffff,r=-0x7fffffff;
int s,ans1[maxn*],ans2[maxn*],h[maxn];
struct node
{
int li,ri,hi;
}p[maxn];
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d%d%d",&p[i].hi,&p[i].li,&p[i].ri);
l=min(l,p[i].li);r=max(r,p[i].ri);
}
for(int i=;i<=n;i++)
for(int j=p[i].li;j<p[i].ri;j++)
h[j]=max(h[j],p[i].hi);
int pre=;
for(int i=l;i<=r;i++)
{
if(h[i]!=pre)
{
ans1[++s]=i;
ans2[s]=pre;
ans1[++s]=i;
ans2[s]=h[i];
pre=h[i];
}
}
printf("%d\n",s);
for(int i=;i<=s;i++)
printf("%d %d\n",ans1[i],ans2[i]);
return ;
}
/*神奇的set+sort*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<set>
#define maxn 200010
using namespace std;
multiset<int,greater<int> >s;
int n,tot,t,ans1[maxn*],ans2[maxn*];
struct node
{
int x,k,b,h;
}q[maxn];
int cmp(const node &q1,const node &q2)//关键的cmp
{
if(q1.x!=q2.x)return q1.x<q2.x;
if(q1.k!=q2.k)return q1.k<q2.k;//挨在一起的 先考虑左 后考虑右 就不会把这里的4个点输出
if(q1.k==)return q1.h>q2.h;//左边 先考虑高的 把低的覆盖了
if(q1.k==)return q1.h<q2.h;//同理
}
int main()
{
scanf("%d",&n);
int l,r,hi;
for(int i=;i<=n;i++)
{
scanf("%d%d%d",&hi,&l,&r);
q[++tot].x=l;q[tot].b=i;q[tot].k=;q[tot].h=hi;
q[++tot].x=r;q[tot].b=i;q[tot].k=;q[tot].h=hi;
}
sort(q+,q++tot,cmp);
for(int i=;i<=tot;i++)
{
if(q[i].k==)
{
if(*s.begin()>=q[i].h)s.insert(q[i].h);
else
{
t+=;
ans1[t]=q[i].x;ans2[t]=*s.begin();
t+=;
ans1[t]=q[i].x;ans2[t]=q[i].h;
s.insert(q[i].h);
}
}
if(q[i].k==)
{
if(*s.begin()==q[i].h&&s.count(q[i].h)==)
{
s.erase(s.find(q[i].h));
t+=;
ans1[t]=q[i].x;ans2[t]=q[i].h;
t+=;
ans1[t]=q[i].x;ans2[t]=*s.begin();
}
else s.erase(s.find(q[i].h));
}
}
printf("%d\n",t);
for(int i=;i<=t;i++)
printf("%d %d\n",ans1[i],ans2[i]);
return ;
}
/*
离散化然后线段树维护每个点的hmax
然后按照打爆力的方法找
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 100010
using namespace std;
int n,m,num,tot,a[maxn*],b[maxn*];
int ans1[maxn*],ans2[maxn*],cnt;
struct node
{
int l,r,h;
}p[maxn];
struct tree
{
int l,r,lc,rc,ans,lazy;
}t[maxn*];
int cmp(const node &x,const node &y)
{
return x.h<y.h;
}
void Build(int li,int ri)
{
int k=++tot;
t[k].l=li;t[k].r=ri;
if(li!=ri-)
{
t[k].lc=tot+;Build(li,(li+ri)/);
t[k].rc=tot+;Build((li+ri)/,ri);
t[k].ans=max(t[t[k].lc].ans,t[t[k].rc].ans);
}
else t[k].ans=;
}
void updata(int k)
{
t[t[k].lc].ans=max(t[t[k].lc].ans,t[k].lazy);
t[t[k].rc].ans=max(t[t[k].rc].ans,t[k].lazy);
t[t[k].lc].lazy=max(t[t[k].lc].lazy,t[k].lazy);
t[t[k].rc].lazy=max(t[t[k].rc].lazy,t[k].lazy);
t[k].lazy=;
}
void Change(int k,int li,int ri,int data)
{
if(li<=t[k].l&&ri>=t[k].r)
{
t[k].ans=max(data,t[k].ans);
t[k].lazy=max(t[k].lazy,data);
return;
}
if(t[k].lazy)updata(k);
int mid=(t[k].l+t[k].r)/;
if(li<mid)Change(t[k].lc,li,ri,data);
if(ri>mid)Change(t[k].rc,li,ri,data);
t[k].ans=max(t[t[k].lc].ans,t[t[k].rc].ans);
}
int Query(int k,int p)
{
if(t[k].l==t[k].r-)return t[k].ans;
if(t[k].lazy)updata(k);
int mid=(t[k].l+t[k].r)/;
if(p<mid)return Query(t[k].lc,p);
else return Query(t[k].rc,p);
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d%d%d",&p[i].h,&p[i].l,&p[i].r);
a[++m]=p[i].l;a[++m]=p[i].r;
}
sort(a+,a+m+);sort(p+,p++n,cmp);
b[++num]=a[];
for(int i=;i<=m;i++)
if(a[i]!=a[i-])b[++num]=a[i];
Build(,m+);
for(int i=;i<=n;i++)
{
int p1=lower_bound(b+,b++num,p[i].l)-b;
int p2=lower_bound(b+,b++num,p[i].r)-b;
Change(,p1,p2,p[i].h);
}
for(int i=;i<=num;i++)
{
ans1[i]=b[i];ans2[i]=Query(,i);
if(ans2[i]!=ans2[i-])cnt++;
}
printf("%d\n",cnt*);
for(int i=;i<=num;i++)
if(ans2[i]!=ans2[i-])
{
printf("%d %d\n",ans1[i],ans2[i-]);
printf("%d %d\n",ans1[i],ans2[i]);
}
return ;
}

codevs 2995 楼房的更多相关文章

  1. 扫描线+堆 codevs 2995 楼房

    2995 楼房  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 地平线(x轴)上有n个矩(lou)形(fan ...

  2. AC日记——楼房 codevs 2995

    2995 楼房  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 地平线(x轴)上有n个矩(lou ...

  3. Codevs堆练习

    Codevs堆练习 黄金:2830.2879.2995.3110 钻石:1052.1063.1245.1246.2057.2573.3377 大师:1021.1765.2069.2913.3032

  4. codevs 1002 搭桥

    codevs 第一道题 先贴描述 1002 搭桥  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description ...

  5. codevs 3289 花匠

    题目:codevs 3289 花匠 链接:http://codevs.cn/problem/3289/ 这道题有点像最长上升序列,但这里不是上升,是最长"波浪"子序列.用动态规划可 ...

  6. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  7. codevs 1285 二叉查找树STL基本用法

    C++STL库的set就是一个二叉查找树,并且支持结构体. 在写结构体式的二叉查找树时,需要在结构体里面定义操作符 < ,因为需要比较. set经常会用到迭代器,这里说明一下迭代器:可以类似的把 ...

  8. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  9. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

随机推荐

  1. Linux 0.11下信号量的实现和应用

    Linux 011下信号量的实现和应用 生产者-消费者问题 实现信号量 信号量的代码实现 关于sem_wait和sem_post sem_wait和sem_post函数的代码实现 信号量的完整代码 实 ...

  2. Reflow、Repaint 性能优化

    涉及到操作大量Dom节点及其样式时,有时感觉画面不顺畅,殊不知浏览器亚历山大了.所以我们心里面一定得清楚 Reflow(回流).Repaint(重绘). 浏览器根据每个Dom节点的样式,包括(大小,颜 ...

  3. poj 2782 Bin Packing (贪心+二分)

    F - 贪心+ 二分 Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu   Description ...

  4. Stack集合 Queue队列集合 Hashtable哈希表

    Stack集合 干草堆集合 栈集合 栈;stack,先进后出,一个一个赋值,一个一个取值,安装顺序来. 属性和方法 实例化 初始化 Stack st = new Stack(); 添加元素 个数 Co ...

  5. Mifare 0简介

    Mifare UltraLight又称为MF0,从UltraLight(超轻的)这个名字就可以看出来,它是一个低成本.小容量的卡片.低成本,是指它是目前市场中价格最低的遵守ISO14443A协议的芯片 ...

  6. 『Python』Python 调用 ZoomEye API 批量获取目标网站IP

    #### 20160712 更新 原API的访问方式是以 HTTP 的方式访问的,根据官网最新文档,现在已经修改成 HTTPS 方式,测试可以正常使用API了. 0x 00 前言 ZoomEye 的 ...

  7. 汇编-显示我放到AL中的数值

    按书上练习,有一些我看不懂. . .model flat,stdcall option casemap:none include \masmplus\include\windows.inc inclu ...

  8. h.264全搜索以及快速全搜索算法

    Full Search 全搜索算法是最简单暴力的一种搜索算法,对搜索范围内的所有像素点都进行匹配对比,选出最合适的运动向量,以下就是一个搜索范围为4的全搜索范围(单个像素点) /*! ******** ...

  9. 读undo问题

    SQL> drop table test1 purge; Table dropped. SQL> create table test1 as select * from dba_objec ...

  10. Yarn应用程序运行流程剖析

    Yarn(Yet Another Resource Negotiator)是一个Hadoop集群资源管理系统,Hadoop2时被引入,旨在提高MapReduce的性能,但YARN已足够通用,使得它可以 ...