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. 【TMD模拟赛】上低音号 链表

    这道题一看有两个出发现点,一枚举点去找边界,想了一会就Pass了...,二是枚举相框,我们最起码枚举两个边界,然后发现平行边界更好处理,然而仍然只有30分,这个时候就来到了链表的神奇应用,我们枚举上界 ...

  2. Cannot resolve symbol ‘Component’ & Cannot resolve symbol ‘PropTypes’

    import React, { Component, PropTypes } from 'react' 报错:Cannot resolve symbol 'Component' Cannot reso ...

  3. The XOR Largest Pair [Trie]

    描述 在给定的N个整数A1,A2--AN中选出两个进行xor运算,得到的结果最大是多少? 输入格式 第一行一个整数N,第二行N个整数A1-AN. 输出格式 一个整数表示答案. 样例输入 3 1 2 3 ...

  4. HDU 5685 Problem A | 快速幂+逆元

    Problem A Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  5. python基础代码(猜年龄、从最内层跳出多层循环、简单的购物车程序)

    1.猜年龄 , 可以让用户最多猜三次! age = 55 i=0 while i<3: user_guess = int (input ("input your guess:" ...

  6. Google Intern

    申请 事情应该从去年(2013)说起,好基友从百度离职跳到了Google,回学校打印本科成绩单,然后晚上在scuacm群里,结果Dr. zuo问我想去实习么,正好有学长可以内推. 于是乎写了简历,然后 ...

  7. 利用cron监视后台进程状态

    利用cron监视后台进程状态 http://blog.csdn.net/dyx810601/article/details/72967758 1. 利用cron监视后台进程状态,如果进程死掉或服务器重 ...

  8. ggplot2绘制多图

    参考链接:http://www.cnblogs.com/nxld/p/6065237.html ggplot2.multiplot是一个易于使用的功能,将多个图形在同一页面上使用R统计软件和GGPLO ...

  9. [ Python - 4 ] python 装饰器

    装饰器有很多经典的使用场景,例如插入日志.性能测试.事务处理等等,有了装饰器,就可以提取大量函数中与本身功能无关的类似代码,从而达到代码重用的目的. 装饰器有两种写法: 1. 装饰器不传参数 2. 装 ...

  10. 点击回到之前页面,并不刷新js histroy

    history是你浏览过的网页的url(简单的说就是网址)的集合,也就是你的浏览器里的那个历史记录.它在js里是一个内置对象,就跟document一样,它有自己的方法,go就是其中一个. 这个方法的参 ...