/*暴力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. hive 桶相关特性分析

    1. hive 桶相关概念     桶(bucket)是指将表或分区中指定列的值为key进行hash,hash到指定的桶中,这样可以支持高效采样工作.     抽样( sampling )可以在全体数 ...

  2. [oracle]删除一张表中重复数据,保留其id字段最小的sql

    1.表数据结构如下 select * from test t , 'jerry'); , 'jerry'); , 'jerry'); , 'tom'); , 'tom'); , 'jake'); , ...

  3. JQUERY1.9学习笔记 之基本过滤器(十) 非选择器

    非选择器jQuery( ":not(selector)" ) 例:找出所有input标签为非"checked"的,并且高亮其邻居元素span. <!DOC ...

  4. php中json_decode()和json_encode()

    1.json_decode() json_decode (PHP 5 >= 5.2.0, PECL json >= 1.2.0) json_decode — 对 JSON 格式的字符串进行 ...

  5. 驱动读写进程内存R3,R0通信

    stdafx.h 头文件代码 #ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later. #defin ...

  6. .Net 4.5 Task

    Task 是 .Net4.0 新出的异步调用方法,粗略看了一下基本对外屏蔽了线程的概念,写异步调用更专注于应用本身. public class Program { static void Main(s ...

  7. iOS App转让流程

    说法一: (1)选择转让APP (2)进入转让界面       点击Continue进入下一步   (3)输入对方的APP ID和Team ID     Apple ID 和 Team ID 可以在m ...

  8. Maven内置隐式变量

    Maven提供了三个隐式的变量可以用来访问环境变量,POM信息,和Maven Settings env env变量,暴露了你操作系统或者shell的环境变量.便 如在Maven POM中一个对${en ...

  9. poi简单案例

    //poi api 操作 public static void main(String[] args) {  // TODO Auto-generated method stub  // 创建一个工作 ...

  10. 转:Google论文之三----MapReduce

    文章来自于:http://www.cnblogs.com/geekma/p/3139823.html MapReduce:大型集群上的简单数据处理 摘要 MapReduce是一个设计模型,也是一个处理 ...