/*暴力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. 页面添加 mask 遮罩层

    var mask = function(){ $('<div>').css({ position: 'fixed', left: 0, top: 0, width: '100%', hei ...

  2. mysql启动不了:ERROR 2002 (HY000): Can’t connect to local MySQL server through socket

    ps aux |grep mysql kill所有列出的进程,然后重启 service mysql start 原因有可能是mysqld没启动:service mysqld start. 持续出现此问 ...

  3. 13_FCITX输入法安装及问题排查解决

    使用linux最沮丧的事情莫过于中文输入法切换不出来,甚至有人错误地认为,要使用中文输入法,必须把“区域和语言”(Region & Language)设置为中国-中文.输入法只是一个软件,和区 ...

  4. asp.net 调用天气所遇到的问题

    由于在项目用了显示天气的功能,原有的调用方法 直接通过      <iframe name="weather_inc" src="http://i.tianqi.c ...

  5. Windows环境下 配置memcached (php)

    memcached就不用介绍了-- 1:在Windows下安装memcached服务端软件,已经下载并上传云盘  ---传送门 记得带钥匙:ykrc 解压缩后里面的安装说明内有安装教程. 2:软件安装 ...

  6. Solr4.8.0源码分析(14)之SolrCloud索引深入(1)

    Solr4.8.0源码分析(14) 之 SolrCloud索引深入(1) 上一章节<Solr In Action 笔记(4) 之 SolrCloud分布式索引基础>简要学习了SolrClo ...

  7. 在CentOS6上使用YUM安装Mysql5.5.x

    1.安装MySQL 5.5.x的yum源: rpm -Uvh http://repo.webtatic.com/yum/centos/5/latest.rpm 2.安装MySQL客户端的支持包: yu ...

  8. 【Maven实战】仓库介绍和Nexus的安装

    在Maven中我们之前进行配置一个项目的依赖时,引用一下jar包,这些jar包第一次都会从一个地方进行下载,这个地方称为仓库,而对于仓库一般有本地仓库和中心仓库之分,但是我们一般在做项目时会在自己的服 ...

  9. Github上最受关注的前端大牛,快来膜拜吧!

    1. Paul Irish Github主页: https://github.com/paulirish 个人主页: http://paulirish.com 维基百科: http://en.wiki ...

  10. Xamarin for OSX – SetUp

    正常情况联网会失败 按照安装顺序进行安装(mono framework->java sdk-> android sdk->xamarin studio->xamarin.and ...