[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 ...
随机推荐
- dns服务 很多问题,后续再研究
慕课网:http://www.imooc.com/video/5220 参考:http://jingyan.baidu.com/article/870c6fc32c028eb03fe4be30.htm ...
- SQL SERVER:删除筛选记录中前100条数据
delete from table1 where id in (select top 100 id from table1)
- android studio的弹出层
<activity android:name=".SecondActivity" android:theme="@style/Theme.AppCompat.Dia ...
- HDU 1698 Just a Hook(线段树
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- saltshaker填坑
参考资料: https://github.com/yueyongyue/saltshaker http://blog.sina.com.cn/s/blog_b21312340102whzw.html ...
- bzoj2424 [HAOI2010]订货 dp+单调性
[HAOI2010]订货 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1311 Solved: 884[Submit][Status][Discu ...
- 7月20号day12总结
今天学习过程和小结 先进行了复习,主要 1,hive导入数据的方式有 本地导入 load data [local] inpath 'hdfs-dir' into table tablename; s ...
- (转)Notepad++
包括notepad++的详细的安装过程,插件使用说明,技巧…… crifan http://www.crifan.com/files/doc/docbook/rec_soft_npp/release/ ...
- bzoj4900 [CTSC2017]密钥
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4900 [题解] 恭喜bzoj达到40页 考场由于傻逼基数排序写挂了而gg. 竟然忘了考试前一 ...
- viewDidLoad方法的调用顺序
https://www.evernote.com/shard/s227/sh/01307822-de66-448d-8bac-7954f01ffc64/185b44c2bf5b6e266f4bed ...