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 ...
随机推荐
- IEEE浮点标准
原文地址:http://www.math.byu.edu/~schow/work/IEEEFloatingPoint.htm Floating point system Floating point ...
- NET Core-学习笔记(二)
这里要分享的是接着上篇:NET Core-学习笔记(一)展开的继续学习core笔记,有不妥之处或者更好见解的地方希望各位朋友多多分享. 下面是本篇将要分享的学习步奏,对于刚学或者即将要学习的朋友做个相 ...
- Oracle数据库升级(10.2.0.4->11.2.0.4)
环境: RHEL5.4 + Oracle 10.2.0.4 目的: 在本机将数据库升级到11.2.0.4 之前总结的Oracle数据库异机升级:http://www.cnblogs.com/jyzha ...
- Objective-C内存管理之引用计数
初学者在学习Objective-c的时候,很容易在内存管理这一部分陷入混乱状态,很大一部分原因是没有弄清楚引用计数的原理,搞不明白对象的引用数量,这样就当然无法彻底释放对象的内存了,苹果官方文档在内存 ...
- EF 在controller弹出提示消息
第一种方式: return Content("<script>alert('此名称课程再次班级中已经存在!');window.location.href = 'Course/Cr ...
- Python input 使用
Python 3.0 中使用"input" , Python 2.0 中使用"raw_input"Python 3.5: #!C:\Program Files\ ...
- SIMLock锁卡功能解析
一.锁卡背景介绍 锁卡即SIMLock,当手机开机启动或者插入SIM卡时,手机modem侧预置在NV项中的配置信息会与SIM卡中的信息做比对,检测是否匹配.若匹配,则SIM卡可以正常使用.若不匹配,则 ...
- 如何在SpringBoot中使用JSP ?但强烈不推荐,果断改Themeleaf吧
做WEB项目,一定都用过JSP这个大牌.Spring MVC里面也可以很方便的将JSP与一个View关联起来,使用还是非常方便的.当你从一个传统的Spring MVC项目转入一个Spring Boot ...
- Js 实现登录验证码
Js代码: /** * 验证码 */function yzm(){ var codeChars = new Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'a','b','c ...
- redis开启远程访问
redis默认只允许本地访问,要使redis可以远程访问可以修改redis.conf 打开redis.conf文件在NETWORK部分有说明 ######################### ...