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 ...
随机推荐
- php 封装
把数据库做成一个类,先建一个php文件,保存.最好和平时写的那些在同一路径下. 便于以后换电脑,只需在封装里面改一下四个参数就可以了 <?php class fengzhuang //类名 { ...
- DotNet程序配置文件
在实际的项目开发中,对于项目的相关信息的配置较多,在.NET项目中,我们较多的将程序的相关配置直接存储的.config文件中,例如web.config和app.config. .NET中配置文件分为两 ...
- 匹夫细说C#:从园友留言到动手实现C#虚函数机制
前言 上一篇文章匹夫通过CIL代码简析了一下C#函数调用的话题.虽然点击进来的童鞋并不如匹夫预料的那么多,但也还是有一些挺有质量的来自园友的回复.这不,就有一个园友提出了这样一个代码,这段代码如果被编 ...
- context:component-scan" 的前缀 "context" 未绑定。
SpElUtilTest.testSpELLiteralExpressiontestSpELLiteralExpression(cn.zr.spring.spel.SpElUtilTest)org.s ...
- Android之图片加载框架Fresco基本使用(二)
PS:最近看到很多人都开始写年终总结了,时间过得飞快,又到年底了,又老了一岁. 学习内容: 1.进度条 2.缩放 3.ControllerBuilder,ControllerListener,Post ...
- 游戏启示录 关于Update的相关问题
游戏启示录 关于Update的相关问题 这里说的Update是指的游戏的主循环.一般情况下.为了程序的方便控制我们一般只会有一个主循环.所有的游戏逻辑都会在这一个循环中完成.(额,其实这么做有点浪费. ...
- .NET DateTime类型变量作为参数时设置默认值
一个小的 Tips. .NET 中函数参数的默认值需要是编译时常量.如果参数是引用类型,可以设置Null,如果是值类型,可以设置相应的编译时常量,如整型可以用整数,但对于DateTime(结构体,值类 ...
- 【Java每日一题】20161223
package Dec2016; public class Ques1223 { public static void main(String[] args){ Integer obj = Integ ...
- 征途 bzoj 4518
征途(1s 256MB)journey [问题描述] Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天 ...
- Java Servlet+Objective-c图上传 步骤详细
一. Servlet 1.创建图片保存的路径 在项目的WebContent下创建一个上传图片的专属文件夹. 这个文件夹创建后,我们保存的图片就在该文件夹的真实路径下,但是在项目中是无法看到上传的图片的 ...