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 ...
随机推荐
- 【完全开源】微信客户端.NET版
目录 说明 功能 原理步骤 一些参考 说明 前两天比较闲,研究了一下web版微信.因为之前看过一篇博客讲微信web协议的,后来尝试分析了一下,半途中发现其实没什么意义,但又不想半途而废,所以最后做出了 ...
- ElasticSearch 5学习(2)——Kibana+X-Pack介绍使用(全)
Kibana是一个为 ElasticSearch 提供的数据分析的 Web 接口.可使用它对日志进行高效的搜索.可视化.分析等各种操作.Kibana目前最新的版本5.0.2,回顾一下Kibana 3和 ...
- 【分布式】Zookeeper会话
一.前言 前面分析了Zookeeper客户端的细节,接着继续学习Zookeeper中的一个非常重要的概念:会话. 二.会话 客户端与服务端之间任何交互操作都与会话息息相关,如临时节点的生命周期.客户端 ...
- c#编程基础之枚举
枚举的意义就在于限制变量取值范围. 当可以确定的几种取值时才可以用. 如果输入一个字符串需要进行判断是否是我们需要的字符串时,则一般需要这样写: using System; using System. ...
- Node基础篇(概要)
Node简介 客户端的JavaScript是怎样的 什么是 JavaScript? 脚本语言 运行在浏览器中 一般用来做客户端页面的交互(Interactive) JavaScript 的运行环境? ...
- jquery获取dropdownlist的value和text值
1.jquery //获取value值 $("#ddlSubmodel").val(); //获取text值 $("#ddlSubmodel").find(&q ...
- springmvc+spring+mybatis+maven项目集成shiro进行用户权限控制【转】
项目结构: 1.maven项目的pom中引入shiro所需的jar包依赖关系 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...
- jquery的选择器
一.基本选择器 1.$("#id") id选择器,返回单个元素 2.$(".class") class选择器,返回集合元素 3.$("element& ...
- Android开发学习—— ContentProvider内容提供者
* 应用的数据库是不允许其他应用访问的* 内容提供者的作用就是让别的应用访问到你的数据库.把私有数据暴露给其他应用,通常,是把私有数据库的数据暴露给其他应用. Uri:包含一个具有一定格式的字符串的对 ...
- swift学习笔记1——基础部分
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...