AC日记——楼房 codevs 2995
地平线(x轴)上有n个矩(lou)形(fang),用三个整数h[i],l[i],r[i]来表示第i个矩形:矩形左下角为(l[i],0),右上角为(r[i],h[i])。地平线高度为0。在轮廓线长度最小的前提下,从左到右输出轮廓线。

第一行一个整数n,表示矩形个数
以下n行,每行3个整数h[i],l[i],r[i]表示第i个矩形。
第一行一个整数m,表示节点个数
以下m行,每行一个坐标表示轮廓线上的节点。从左到右遍历轮廓线并顺序输出节点。第一个和最后一个节点的y坐标必然为0。
【样例输入】
2
3 0 2
4 1 3
【样例输入2】
5
3 -3 0
2 -1 1
4 2 4
2 3 7
3 6 8
【样例输出】
6
0 0
0 3
1 3
1 4
3 4
3 0
【样例输出2】
14
-3 0
-3 3
0 3
0 2
1 2
1 0
2 0
2 4
4 4
4 2
6 2
6 3
8 3
8 0
对于30%的数据,n<=100
对于另外30%的数据,n<=100000,1<=h[i],l[i],r[i]<=1000
对于100%的数据,1<=n<=100000,1<=h[i]<=10^9,-10^9<=l[i]<r[i]<=10^9
#include <map>
#include <cstdio>
#include <iostream>
#include <algorithm> using namespace std; struct node {
long long int l,r,dis;
};
struct node edge[]; inline void read_int(long long int &now_); class T_tree {
public:
int l,r,mid;
long long int dis,flag; void mid_()
{
mid=(l+r)>>;
} void flag_()
{
flag=;
} void dis_()
{
dis=;
}
};
class T_tree tree[**]; long long int n,if_Z,num=,before=,before_=;
long long int point[*],ans=,ans_now[*],ans_dis[*]; char Cget; bool if_fi=true; map<long long int,long long int>if_; inline void read_int(long long int &now_)
{
now_=,if_Z=,Cget=getchar();
while(Cget<''||Cget>'')
{
if(Cget=='-') if_Z=-;
Cget=getchar();
}
while(Cget<=''&&Cget>='')
{
now_=now_*+Cget-'';
Cget=getchar();
}
now_*=if_Z;
} inline bool cmp(struct node some1,struct node some2)
{
return some1.dis<some2.dis;
} void tree_build(int now,int l,int r)
{
tree[now].l=l,tree[now].r=r;
if(l==r)
{
tree[now].dis_();
return ;
}
tree[now].mid_();
tree_build(now<<,l,tree[now].mid);
tree_build(now<<|,tree[now].mid+,r);
} inline void tree_down(int now)
{
if(tree[now].l==tree[now].r) return ;
tree[now<<].dis=tree[now].flag;
tree[now<<].flag=tree[now].flag;
tree[now<<|].dis=tree[now].flag;
tree[now<<|].flag=tree[now].flag;
tree[now].flag_();
} void tree_change(int now,int l,int r,long long int dis)
{
if(tree[now].l==l&&tree[now].r==r)
{
tree[now].dis=dis;
tree[now].flag=dis;
tree_down(now);
return ;
}
if(tree[now].flag) tree_down(now);
if(l>tree[now].mid) tree_change(now<<|,l,r,dis);
else if(r<=tree[now].mid) tree_change(now<<,l,r,dis);
else
{
tree_change(now<<,l,tree[now].mid,dis);
tree_change(now<<|,tree[now].mid+,r,dis);
}
} int times=; void tree_check(int now)
{
if(tree[now].l==tree[now].r)
{
if(tree[now].dis!=before)
{
ans_now[++ans]=point[tree[now].l];
ans_dis[ans]=before;
ans_now[++ans]=point[tree[now].l];
ans_dis[ans]=tree[now].dis;
before=tree[now].dis;
}
return ;
}
if(tree[now].flag) tree_down(now);
tree_check(now<<),tree_check(now<<|);
} int main()
{
read_int(n);
for(int i=;i<=n;i++)
{
read_int(edge[i].dis),read_int(edge[i].l),read_int(edge[i].r);
if_[edge[i].l]=edge[i].l,if_[edge[i].r]=edge[i].r;
}
for(map<long long int,long long int>::iterator it=if_.begin();it!=if_.end();it++)
{
point[++num]=it->first;
it->second=num;
}
tree_build(,,num+);
sort(edge+,edge+n+,cmp);
for(int i=;i<=n;i++)
{
tree_change(,if_[edge[i].l],if_[edge[i].r]-,edge[i].dis);
}
tree_check();
printf("%lld\n",ans);
for(int i=;i<=ans;i++) printf("%lld %lld\n",ans_now[i],ans_dis[i]);
return ;
}
附失败代码(>.<):
#include <map>
#include <cstdio>
#include <iostream>
#include <algorithm> using namespace std; struct node {
int l,r,dis;
};
struct node edge[]; inline void read_int(int &now_); class T_tree {
public:
int l,r,mid,dis,flag; void mid_()
{
mid=(l+r)>>;
} void flag_()
{
flag=;
} void dis_()
{
//read_int(dis);
dis=;
}
};
class T_tree tree[**];
class T_tree ok[**]; int n,if_Z,num=,before=,before_=;
int point[*],ans=,ans_now[*+],ans_dis[*+]; char Cget; bool if_fi=true; map<int,int>if_; inline void read_int(int &now_)
{
now_=,if_Z=,Cget=getchar();
while(Cget<''||Cget>'')
{
if(Cget=='-') if_Z=-;
Cget=getchar();
}
while(Cget<=''&&Cget>='')
{
now_=now_*+Cget-'';
Cget=getchar();
}
now_*=if_Z;
} inline bool cmp(struct node some1,struct node some2)
{
return some1.dis<some2.dis;
} void ok_build(int now,int l,int r)
{
ok[now].l=l,ok[now].r=r;
if(l==r) return ;
ok[now].mid_();
ok_build(now<<,l,ok[now].mid);
ok_build(now<<|,ok[now].mid+,r);
} void ok_down(int now)
{
if(ok[now].l==ok[now].r) return ;
ok[now<<].dis=ok[now].flag;
ok[now<<].flag=ok[now].flag;
ok[now<<|].dis=ok[now].flag;
ok[now<<|].flag=ok[now].flag;
ok[now].flag=;
} void ok_change(int now,int l,int r)
{
if(ok[now].dis) return ;
if(ok[now].l==ok[now].r)
{
ok[now].dis=;
ok[now].flag=;
ok_down(now);
return ;
}
if(ok[now].flag) ok_down(now);
if(l>ok[now].mid) ok_change(now<<|,l,r);
else if(r<=ok[now].mid) ok_change(now<<,l,r);
else
{
ok_change(now<<,l,ok[now].mid);
ok_change(now<<|,ok[now].mid+,r);
}
} bool ok_ko(int now,int to)
{
if(ok[now].dis) return true;
if(ok[now].l==ok[now].r&&ok[now].l==to)
{
return false;
}
if(ok[now].flag) ok_down(now);
if(ok[now].l>to) return ok_ko(now<<|,to);
else return ok_ko(now<<,to);
} void tree_build(int now,int l,int r)
{
tree[now].l=l,tree[now].r=r;
if(l==r)
{
tree[now].dis_();
return ;
}
tree[now].mid_();
tree_build(now<<,l,tree[now].mid);
tree_build(now<<|,tree[now].mid+,r);
} inline void tree_down(int now)
{
if(tree[now].l==tree[now].r) return ;
tree[now<<].dis=tree[now].flag;
tree[now<<].flag=tree[now].flag;
tree[now<<|].dis=tree[now].flag;
tree[now<<|].flag=tree[now].flag;
tree[now].flag_();
} void tree_change(int now,int l,int r,int dis)
{
if(tree[now].l==l&&tree[now].r==r)
{
tree[now].dis=dis;
tree[now].flag=dis;
tree_down(now);
return ;
}
if(tree[now].flag) tree_down(now);
if(l>tree[now].mid) tree_change(now<<|,l,r,dis);
else if(r<=tree[now].mid) tree_change(now<<,l,r,dis);
else
{
tree_change(now<<,l,tree[now].mid,dis);
tree_change(now<<|,tree[now].mid+,r,dis);
}
} int times=; void tree_check(int now)
{
if(tree[now].l==tree[now].r)
{
/*if(tree[now].dis!=before_)
{
times++;
if(times==1)
{
printf("%d %d\n",point[tree[now].l],before);
printf("%d %d\n",point[tree[now].l],tree[now].dis);
}
else
{
printf("%d %d\n",point[tree[now].l],tree[now].dis);
}
before_=tree[now].dis;
}*/
//printf("(%d,%d)",point[tree[now].l],tree[now].dis);
if(tree[now].l==num+)
{
if(before!=)
{
//printf("%d %d\n",point[num],before);
//printf("%d %d\n",point[num],0);
ans_now[++ans]=point[num];
ans_dis[ans]=before;
ans_now[++ans]=point[num];
ans_dis[ans]=;
}
}
else
{
if(ok_ko(,tree[now].l-))
{
if(tree[now].dis!=before)
{
//printf("%d %d\n%d %d\n",point[tree[now].l],before,point[tree[now].l],tree[now].dis);
ans_now[++ans]=point[tree[now].l];
ans_dis[ans]=before;
ans_now[++ans]=point[tree[now].l];
ans_dis[ans]=tree[now].dis;
before=tree[now].dis;
}
}
else
{
if(before!=)
{
//printf("%d %d\n",point[tree[now].l-1],point[tree[now].l]);
ans_now[++ans]=point[tree[now].l-];
ans_dis[ans]=before;
ans_now[++ans]=point[tree[now].l-];
ans_dis[ans]=;
ans_now[++ans]=point[tree[now].l];
ans_dis[ans]=;
ans_now[++ans]=point[tree[now].l];
ans_dis[ans]=tree[now].dis;
before=tree[now].dis;
}
}
}
//printf("(%d %d)\n",point[tree[now].l],tree[now].dis);
return ;
}
if(tree[now].flag) tree_down(now);
tree_check(now<<),tree_check(now<<|);
} int main()
{
read_int(n);
for(int i=;i<=n;i++)
{
read_int(edge[i].dis),read_int(edge[i].l),read_int(edge[i].r);
if_[edge[i].l]=edge[i].l,if_[edge[i].r]=edge[i].r;
}
// printf("\n\n");
for(map<int,int>::iterator it=if_.begin();it!=if_.end();it++)
{
point[++num]=it->first;
it->second=num;
// printf("%d %d\n",num,point[num]);
}
tree_build(,,num+);
ok_build(,,num-);
ok_change(,,);
sort(edge+,edge+n+,cmp);
for(int i=;i<=n;i++)
{
printf("%d %d\n",if_[edge[i].l],if_[edge[i].r]);
}
printf("\n\n");
for(int i=;i<=n;i++)
{
//printf("%d %d %d\n\n",if_[edge[i].l],if_[edge[i].r],edge[i].dis);
tree_change(,if_[edge[i].l],if_[edge[i].r],edge[i].dis);
ok_change(,if_[edge[i].l],if_[edge[i].r]-);
printf("%d %d\n",if_[edge[i].l],if_[edge[i].r]-);
//ans=0;
//before=0;
//tree_check(1);
//printf("\n");
//printf("%d %d %d\n",if_[edge[i].l],if_[edge[i].r],edge[i].dis);
}
printf("\n\n");
//ans=0;
//before=0;
tree_check();
//printf("\n\n");
printf("%d\n",ans);
for(int i=;i<=ans;i++) printf("%d %d\n",ans_now[i],ans_dis[i]);
return ;
}
AC日记——楼房 codevs 2995的更多相关文章
- AC日记——传话 codevs 1506 (tarjan求环)
1506 传话 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 题目描述 Description 一个朋友网络,如果a认识b,那么如果a第 ...
- AC日记——绿色通道 codevs 3342
3342 绿色通道 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description <思远高考绿色通道&g ...
- AC日记——蓬莱山辉夜 codevs 2830
2830 蓬莱山辉夜 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 在幻想乡中,蓬莱山辉夜是月球 ...
- AC日记——苹果树 codevs 1228
1228 苹果树 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 在卡卡的房子外面,有一棵 ...
- AC日记——刺激 codevs 1958
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description saffah的一个朋友S酷爱滑雪,并且追求刺激(exitement,由于刺激 ...
- AC日记——红与黑 codevs 2806
2806 红与黑 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 白银 Silver 题解 查看运行结果 题目描述 Description 有一个矩形房间,覆盖正方形瓷 ...
- AC日记——热浪 codevs 1557 (最短路模板题)
1557 热浪 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 德克萨斯纯朴的民眾们这个夏 ...
- AC日记——字典 codevs 4189
4189 字典 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题解 查看运行结果 题目描述 Description 最经,skyzhong得到了 ...
- AC日记——开关灯 codevs 1690
开关灯 思路: 线段树: bool懒标记维护: 更新区间时是区间总值减去当前值: 来,上代码: #include <cstdio> #include <cstring> #in ...
随机推荐
- 4. SVM分类器求解(2)
最优间隔分类器(optimal margin classifier) 重新回到SVM的优化问题: 我们将约束条件改写为: 从KKT条件得知只有函数间隔是1(离超平面最近的点)的线性约束式前面的系数,也 ...
- 【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之缓存融合技术和主要后台进程(四)
缓存融合技术和主要后台进程(四) 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇总.然后形成体 ...
- 使用swagger作为restful api的doc文档生成
初衷 记得以前写接口,写完后会整理一份API接口文档,而文档的格式如果没有具体要求的话,最终展示的文档则完全决定于开发者的心情.也许多点,也许少点.甚至,接口总是需要适应新需求的,修改了,增加了,这份 ...
- JQuery的核心的一些方法[扒来的]
JQuery的核心的一些方法 each(callback) '就像循环 $("Element").length; ‘元素的个数,是个属性 $("Element" ...
- 经典的一款jQuery soChange幻灯片
soChange一款多很经典的幻灯片的jQuery插件. 实例预览 引入文件 <link rel="stylesheet" type="text/css" ...
- ArcGIS Engine开发之地图基本操作(3)
地图数据的加载 一.加载Shapefile数据 Shapefile文件是目前主流的一种空间数据的文件存储方式,也是不同GIS软件进行数据格式转换常用的中间格式.加载Shapefile数据的方式有两种: ...
- android 自定义控件——(四)圆形进度条
----------------------------------↓↓圆形进度条(源代码下有属性解释)↓↓---------------------------------------------- ...
- iOS开发--弹窗多选、单选框架
最近刚毕业...因为个毕设,都离职了又得重新找工作了,这是之前自己没事开直播写的一个小框架,后来各种趋于稳定后,简单的封装了下,写了个小demo,这里就不废话了,直接贴地址,也不编辑了,自己复制过去看 ...
- JQuery 了解
jQuery是什么?为什么是这样?怎么用? jQuery是对JavaScript的一种封装,是一个常用功能库.javascript是做什么的jquery就是做啥的.用它主要使写js更简便而强大,有些功 ...
- 什么是JS事件冒泡?
什么是JS事件冒泡?: 在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理 程序或者事件返回true,那么 ...