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. typescript的入门

    命令行使用tsc 1.安装typescript npm install -g typescript 2.新建一个index.ts 输入export hello class{} 3.编译 tsc ind ...

  2. URAL - 1486 Equal Squares 二维哈希+二分

    During a discussion of problems at the Petrozavodsk Training Camp, Vova and Sasha argued about who o ...

  3. codeforces 110E Lucky Tree

    传送门:https://codeforces.com/contest/110/problem/E 题意:给你一颗树,节点与节点之间的边有一个边权,定义只由4和7组成的数字是幸运数字,现在要你求一共有多 ...

  4. Hbase写入量大导致region过大无法split问题

    最近在线上往hbase导数据,因为hbase写入能力比较强,没有太在意写的问题.让业务方进行历史数据的导入操作,中间发现一个问题,写入速度太快,并且业务数据集中到其中一个region,这个region ...

  5. IDEA 使用maven创建web项目,打包war时不会创建class文件

    使用maven创建项目后我有创建了个src的目录,导致maven编译不能识别我创建的src文件下的Java文件 修改这样后就可以识别编译Java文件 今天又给自己挖了个坑.......

  6. 转:Spring AOP 注解方式实现的一些“坑”

    使用过Spring AOP的注解方式实现,也入过不少坑,现在做一下记录,希望有同样需求的朋友可以少走弯路 使用之前还是先过一下官方文档吧,至少可以少走弯路,不用担心英文读不懂,其实只看代码例子就能理解 ...

  7. 【IDEA】设置类头注释和方法注释

    idea和eclipse的注释还是有一些差别的. 类头注释: 打开file->setting->Editor->Filr and Code Templates->Include ...

  8. Backbone Collection 源码简谈

    一切由一个例子引发: var Man=Backbone.Model.extend({ initilize:function(){ this.bind('change:name',function(){ ...

  9. swoole扩展安装

    1Swoole扩展的编译安装 Swoole扩展是按照php标准扩展构建的.使用phpize来生成php编译配置,./configure来做编译配置检测,make和make install来完成安装. ...

  10. 获取span中的值

    js-code:var baseinfoallfeesum=$("#allFeeSum").html(); $("#baseInfoAllFeeSum").va ...