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 ...
随机推荐
- MVC5 网站开发之七 用户功能 2 用户添加和浏览
目录 MVC5网站开发之一 总体概述 MVC5 网站开发之二 创建项目 MVC5 网站开发之三 数据存储层功能实现 MVC5 网站开发之四 业务逻辑层的架构和基本功能 MVC5 网站开发之五 展示层架 ...
- Hawk 2. 软件界面介绍
2. 软件界面介绍 1. 基本组件 Hawk采用类似Visual Studio和Eclipse的Dock风格,所有的组件都可以悬停和切换.包括以下核心组件: 左上角区域:主要工作区,任务管理. 下方: ...
- Mysql5.6 online ddl
Innodb性能改善方面: --Users can add indexes and perform standard table alterations while the database rema ...
- 4D卓越团队-两天培训总结
上周末参加了公司组织的领导力培训课程-4D卓越团队(创业型团队领导力训练项目),感觉有一些用,在这里分享一下. 课前游戏 培训老师先带我们做了一个游戏:每一个人,在同时参加培训的人中找到另外的 6 个 ...
- 【工匠大道】Mac下Java开发环境配置简述
本文地址 原文地址 分享提纲: 1. 下载JDK1.7 2. 配置java_home 3 .安装tomcat 4 .安装eclipse或者myeclipse 5. mysql安装 破解版下载请参考M ...
- 【JS基础】DOM操作
appendChild() //向节点添加最后一个子节点 createElement() //创建元素节点 createTextNode() //创建文本节点,字符串值
- jqGrid插件getCol方法的一个改进
jgGrid插件是非常常用的一个基于jQuery的表格插件,功能非常强大.我最近也频繁使用.但是这个插件也有一些不够完善的地方.比如这个getCol方法. getCol方法接受三个参数 colname ...
- HTML5新特性之Mutation Observer
Mutation Observer(变动观察器)是监视DOM变动的接口.当DOM对象树发生任何变动时,Mutation Observer会得到通知. 要概念上,它很接近事件.可以理解为,当DOM发生变 ...
- 一步步实现ABAP后台导入EXCEL到数据库【3】
在一步步实现ABAP后台导入EXCEL到数据库[2]里,我们已经实现计划后台作业将数据导入数据库的功能.但是,这只是针对一个简单的自定义结构的导入程序.在实践应用中,面对不同的表.不同的导入文件,我们 ...
- 学习笔记 MSSQL显错手工注入
和朋友一起学习,速度就是快.感谢珍惜少年时. 网上很多都在长篇大论MSSQL显错手工注入,其实原理只有一小段.如下: ' and (查询一段内容)=1 and 'C'='Cnvarchar类型(查询一 ...