Link:

Codeforces 35E 传送门

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的更多相关文章

  1. Codeforces 35E Parade 扫描线

    题意: 给出\(n\)个底边在\(x\)轴上的矩形,求外面的轮廓线顶点. 分析: 将每个矩形拆成两个事件:\(\\\{ l, y, + \\\}\)和\(\\\{ r, y, - \\\}\)分别表示 ...

  2. Codeforces 35E Parade 扫描线 + list

    主题链接:点击打开链接 意甲冠军:特定n矩阵(总是接近底部x轴) 然后找到由上面的矩阵所包围的路径,的点 给定n 以下n行给定 y [x1, x2] 表示矩阵的高度和2个x轴坐标 思路: 扫描线维护每 ...

  3. Codeforces 378B. Parade

    B. Parade time limit per test 1 second memory limit per test 256 megabytes input standard input outp ...

  4. CodeForces 733B Parade

    B. Parade time limit per test1 second memory limit per test256 megabytes inputstandard input outputs ...

  5. 线段树详解 (原理,实现与应用)(转载自:http://blog.csdn.net/zearot/article/details/48299459)

    原文地址:http://blog.csdn.net/zearot/article/details/48299459(如有侵权,请联系博主,立即删除.) 线段树详解    By 岩之痕 目录: 一:综述 ...

  6. 【非常高%】【codeforces 733B】Parade

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  7. Codeforces Beta Round #35 (Div. 2) E. Parade(扫描线)

    题目链接 只要会做,周长并,这题肯定有思路. 有个小地方敲错了,细心啊,扫描线,有一段时间没写过了,还有注意排序的问题,很重要. #include <iostream> #include ...

  8. CodeForces - 1250J The Parade 二分

    题目 题意: 一共n种身高,每一个士兵有一个身高.你需要把他们安排成k行(士兵不需要全部安排),每一行士兵身高差距小于等于1.你要找出来最多能安排多少士兵 题解: 这道题很容易就能看出来就是一道二分, ...

  9. Codeforces水题集合[14/未完待续]

    Codeforces Round #371 (Div. 2) A. Meeting of Old Friends |B. Filya and Homework A. Meeting of Old Fr ...

随机推荐

  1. volatile的原理分析

    前言:Volatile作为一个多线程开发中的强有力的轻量级的线程协助工具,在实际编程中随处可见,它比synchronized更加轻量和方便,消耗的资源更少,了解Volatile对后面了解多线程有很重要 ...

  2. taotao购物车2 解决购物车本地cookie和服务器redis不同步的问题

    下面的思路逻辑一定要理清楚,比较绕 思路; 前面已经实现了在cookie本地维护购物车的功能, 这次加入和服务器同步功能, 因为 购物车 操作比较频繁,所以,后台服务器 用redis存储用户的购物车信 ...

  3. Codeforces Round #534 (Div. 2) D. Game with modulo(取余性质+二分)

    D. Game with modulo 题目链接:https://codeforces.com/contest/1104/problem/D 题意: 这题是一个交互题,首先一开始会有一个数a,你最终的 ...

  4. fscanf函数的应用

    转摘自:http://blog.csdn.net/mxgsgtc/article/details/13005675 以前老是被从文本里读取文件,然后逐个的进行字符解析,感觉非常的慢,自从知道了fsca ...

  5. Ant Design 使用小结

    最近公司做了一个系统,因为页面涉及的表单交互非常多,如果使用之前的 Node + Express 的开发模式效率是非常低的,因此经过考虑,最后决定使用 Node + React 的开发模式,并且使用了 ...

  6. Android百度地图的使用

    做关于位置或者定位的app的时候免不了使用地图功能,本人最近由于项目的需求需要使用百度地图的一些功能,所以这几天研究了一下,现写一下blog记录一下,欢迎大家评论指正! 一.申请AK(API Key) ...

  7. 【洛谷 P3469】[POI2008]BLO-Blockade(割点)

    题目链接 题意:一个无向联通图,求删去每个点及其所有边后有多少有序点对的连通性发生了变化. Tarjan求割点的例题.. 如果当前点不是割点,那么它对整个图的连通性不产生影响,只有自己与其他\(n-1 ...

  8. 全局axios默认值 和 自定义实例默认值

    首先说了一下情况, 登录后成功返回token 然后在带着token去继续下面的请求, 奇怪的是都是当前页面起作用,刷新和跳转之后就token 就消失了. 查了 axios文档发现 被自己坑了 我设置了 ...

  9. csrf_execmp

    参考;https://www.cnblogs.com/zhaof/p/6281482.html 全局: 中间件 django.middleware.csrf.CsrfViewMiddleware 局部 ...

  10. Codeforces 270E Flawed Flow 网络流问题

    题意:给出一些边,给出边的容量.让你为所有边确定一个方向使得流量最大. 题目不用求最大流, 而是求每条边的流向,这题是考察网络流的基本规律. 若某图有最大,则有与源点相连的边必然都是流出的,与汇点相连 ...