[Codeforces 35E] Parade
Link:
Brief Intro:
给定$n$个矩形,求出轮廓线的所有顶点
Solution:
对于此类可拆分成多个事件点的题目,使用扫描线的方式
将每个矩形分为起始边和终止边两个事件,排序,按顺序扫描
分类讨论:
维护当前最高的高度,
(1)如果是起始边,判断其高度是否高于当前高度,如果是,判断添加一个点还是两个点
(2)如果是终止边,判断其是否为当前唯一的最高高度,考虑是否要添加2个节点
TIP:
(1)注意,此题要能维护出每个高度和其出现的次数,
因此由$set$改为$multiset$进行处理
(2)同时对于相同点,要先处理“起始事件”,再处理“终止事件”,
在$cmp$中要另行判断,否则可能多输出点
Code:
#include <bits/stdc++.h> using namespace std;
const int MAXN=1e5+,INF=1e9+;
#define X first
#define Y second
typedef pair<int,int> P;
typedef pair<P,int> PP;
int n,cnt=;
PP dat[*MAXN];
P res[MAXN];
multiset<int> s; bool cmp(PP a,PP b)
{
if(a.X==b.X) return a.Y>b.Y;
return a.X<b.X;
} int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
dat[i].X.X=y;dat[i].X.Y=x;dat[i].Y=;
dat[n+i].X.X=z;dat[n+i].X.Y=x;dat[n+i].Y=-;
}
sort(dat+,dat+*n+,cmp); s.insert();
for(int i=;i<=*n;i++)
{
if(dat[i].Y==)
{
if(dat[i].X.Y>*(--s.end()))
{
if(cnt> && dat[i].X.X==res[cnt].X && res[cnt].X==res[cnt-].X) cnt--;
else res[++cnt]=P(dat[i].X.X,*(--s.end()));
res[++cnt]=P(dat[i].X.X,dat[i].X.Y);
}
s.insert(dat[i].X.Y);
}
else if(dat[i].Y==-)
{
if(dat[i].X.Y==*(--s.end()) && s.count(dat[i].X.Y)==)
{
s.erase(s.find(dat[i].X.Y));
res[++cnt]=P(dat[i].X.X,dat[i].X.Y);
res[++cnt]=P(dat[i].X.X,*(--s.end()));
}
else s.erase(s.find(dat[i].X.Y));
}
}
printf("%d\n",cnt);
for(int i=;i<=cnt;i++) printf("%d %d\n",res[i].X,res[i].Y);
return ;
}
[Codeforces 35E] Parade的更多相关文章
- Codeforces 35E Parade 扫描线
题意: 给出\(n\)个底边在\(x\)轴上的矩形,求外面的轮廓线顶点. 分析: 将每个矩形拆成两个事件:\(\\\{ l, y, + \\\}\)和\(\\\{ r, y, - \\\}\)分别表示 ...
- Codeforces 35E Parade 扫描线 + list
主题链接:点击打开链接 意甲冠军:特定n矩阵(总是接近底部x轴) 然后找到由上面的矩阵所包围的路径,的点 给定n 以下n行给定 y [x1, x2] 表示矩阵的高度和2个x轴坐标 思路: 扫描线维护每 ...
- Codeforces 378B. Parade
B. Parade time limit per test 1 second memory limit per test 256 megabytes input standard input outp ...
- CodeForces 733B Parade
B. Parade time limit per test1 second memory limit per test256 megabytes inputstandard input outputs ...
- 线段树详解 (原理,实现与应用)(转载自:http://blog.csdn.net/zearot/article/details/48299459)
原文地址:http://blog.csdn.net/zearot/article/details/48299459(如有侵权,请联系博主,立即删除.) 线段树详解 By 岩之痕 目录: 一:综述 ...
- 【非常高%】【codeforces 733B】Parade
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- Codeforces Beta Round #35 (Div. 2) E. Parade(扫描线)
题目链接 只要会做,周长并,这题肯定有思路. 有个小地方敲错了,细心啊,扫描线,有一段时间没写过了,还有注意排序的问题,很重要. #include <iostream> #include ...
- CodeForces - 1250J The Parade 二分
题目 题意: 一共n种身高,每一个士兵有一个身高.你需要把他们安排成k行(士兵不需要全部安排),每一行士兵身高差距小于等于1.你要找出来最多能安排多少士兵 题解: 这道题很容易就能看出来就是一道二分, ...
- Codeforces水题集合[14/未完待续]
Codeforces Round #371 (Div. 2) A. Meeting of Old Friends |B. Filya and Homework A. Meeting of Old Fr ...
随机推荐
- redux-saga基本用法
redux-saga是管理redux异步操作的中间件,redux-saga通过创建sagas将所有异步操作逻辑收集在一个地方集中处理. sagas采用Generator函数来yield Effects ...
- [fzu 2273]判断两个三角形的位置关系
首先判断是否相交,就是枚举3*3对边的相交关系. 如果不相交,判断包含还是相离,就是判断点在三角形内还是三角形外.两边各判断一次. //http://acm.fzu.edu.cn/problem.ph ...
- tcp/ip网络协议学习
链路层介绍 网络层协议的数据单元是 IP 数据报 ,而数据链路层的工作就是把网络层交下来的 IP 数据报 封装为 帧(frame)发送到链路上,以及把接收到的帧中的数据取出并上交给网络层. 以太网 以 ...
- AngularJs学习——何时应该使用Directive、Controller、Service?
翻译:大漠穷秋 原文链接:http://kirkbushell.me/when-to-use-directives-controllers-or-services-in-angular/ 一.简述 A ...
- Fragment使用--文章集锦
android使用Fragment实现底部菜单使用show()和hide()来切换以保持Fragment状态 Android Fragment 真正的完全解析(上) Android Fragment实 ...
- 稀疏编码概率解释(基于1996年Olshausen与Field的理论 )
一.Sparse Coding稀疏编码 稀疏编码算法是一种无监督学习方法,它用来寻找一组“超完备”基向量来更高效地表示样本数据.稀疏编码算法的目的就是找到一组基向量 ,使得我们能将输入向量 表示为这些 ...
- 基于vlc sdk的二次开发--环境搭建、编译
前言 关于 搭建.编译VLC,不同的平台有不同的方法,可以参考wiki. 其中在windows下编译VLC有两种方式,MSYS+MinGW和CygWin.通过测试,最后决定采用MSYS+MinGW搭建 ...
- cookie和session的区别与会话跟踪技术
会话跟踪技术: HTTP是一种无状态协议,每当用户发出请求时,服务器就会做出响应,客户端与服务器之间的联系是离散的.非连续的.当用户在同一网站的多个页面之间转换时,根本无法确定是否是同一个客户,会话跟 ...
- 算法题之Climbing Stairs(leetcode 70)
题目: You are climbing a stair case. It takes n steps to reach to the top. Each time you can either cl ...
- 【反演复习计划】【bzoj2154】Crash的数字表格
膜拜cdc……他的推导详细到我这种蒟蒻都能看得懂! 膜拜的传送门 所以我附一下代码就好了. #include<bits/stdc++.h> #define N 10000005 #defi ...