题意:

给出\(n\)个底边在\(x\)轴上的矩形,求外面的轮廓线顶点。

分析:

将每个矩形拆成两个事件:\(\\\{ l, y, + \\\}\)和\(\\\{ r, y, - \\\}\)分别表示在扫描先到\(l\)位置将\(y\)插入数据结构,和扫描线到\(r\)位置将\(y\)从数据结构种删除。

并且该数据结构支持查询最大值

维护数据结构中的当前最大值,每当最大值发生变化时,便找到轮廓线上的两个点\((x,preH)\),\((x,curH)\)。

初始时将\(0\)加入数据结构表示地平线,就不用特判集合是否非空。

STL中的multiset就可以完成上述操作。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <utility>
#include <set>
#include <vector>
using namespace std; typedef pair<int, int> PII; multiset<int> S;
vector<PII> event, ans; int main()
{
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout); int n; scanf("%d", &n);
for(int i = 0; i < n; i++) {
int y, l, r; scanf("%d%d%d", &y, &l, &r);
event.push_back(make_pair(l, y));
event.push_back(make_pair(r, -y));
} sort(event.begin(), event.end()); S.insert(0);
int hmax = 0;
for(int i = 0, j; i < n * 2; i = j) {
for(j = i; j < n * 2 && event[i].first == event[j].first; j++) {
if(event[j].second > 0) S.insert(event[j].second);
else S.erase(S.lower_bound(-event[j].second));
}
if((*S.rbegin()) != hmax) {
ans.push_back(make_pair(event[i].first, hmax));
ans.push_back(make_pair(event[i].first, hmax = (*S.rbegin())));
}
} printf("%d\n", ans.size());
for(int i = 0; i < ans.size(); i++) {
printf("%d %d\n", ans[i].first, ans[i].second);
} return 0;
}

Codeforces 35E Parade 扫描线的更多相关文章

  1. Codeforces 35E Parade 扫描线 + list

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

  2. [Codeforces 35E] Parade

    Link: Codeforces 35E 传送门 Brief Intro: 给定$n$个矩形,求出轮廓线的所有顶点 Solution: 对于此类可拆分成多个事件点的题目,使用扫描线的方式 将每个矩形分 ...

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

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

  4. Codeforces 378B. Parade

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

  5. CodeForces 733B Parade

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

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

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

  7. mark一下咕掉的题目

    蒟蒻才普及组呀~ 大佬别D我 等集中补一下 CF980F:咋说捏,我觉得要联赛了做这题有点浪费时间,等想颓废了再来写写叭qwq 215E/279D/288E/331C3/431D/433E/750G/ ...

  8. Codeforces VK CUP 2015 D. Closest Equals(线段树+扫描线)

    题目链接:http://codeforces.com/contest/522/problem/D 题目大意:  给你一个长度为n的序列,然后有m次查询,每次查询输入一个区间[li,lj],对于每一个查 ...

  9. Codeforces Round #337 (Div. 2) D. Vika and Segments 线段树扫描线

    D. Vika and Segments 题目连接: http://www.codeforces.com/contest/610/problem/D Description Vika has an i ...

随机推荐

  1. enable orgmode latex preview to support retina on mac

    Table of Contents 1. enable orgmode latex preview to support retina on mac 1.1. get the proper versi ...

  2. Java static修饰符小记

    首先我们明确一点:java是一个纯面向对象的编程语言,它的每一个文件都视为一个类,当我们创建一个对象的时候,就是在调用一个文件,那么这个时候,这个文件(类)里的一些东西,它是需要通过对象来使用或访问, ...

  3. jsop解析获得htmldome

    package com.open1111.jsoup; import org.apache.http.HttpEntity;import org.apache.http.client.methods. ...

  4. Head First Python 读书笔记

    记录一下这段时间看<Head First Python>记录的一些小知识,只是记了很少一部分,有需要的话以后再添加吧. for循环的使用: for 目标标识符 in 列表: 处理代码 if ...

  5. 简析平衡树(二)——Treap

    前言 学完了替罪羊树,我决定再去学一学\(Treap\).一直听说\(Treap\)很难,我也花了挺久才学会. 简介 \(Treap\)这个名字真的挺有内涵: \(\color{red}{Tree}\ ...

  6. 求和VII

    问题 K: 求和VII 时间限制: 2 Sec  内存限制: 256 MB提交: 422  解决: 53[提交] [状态] [讨论版] [命题人:admin] 题目描述 master对树上的求和非常感 ...

  7. 2018.6.16 PHP小实验

    PHP实验 实验一 <?php /** * Created by PhpStorm. * User: qichunlin * Date: 2018/5/17 * Time: 下午5:35 */ ...

  8. python_34_文件操作3

    f=open('yesterday',encoding='utf-8') print(f.tell())#文件句柄所在指针指向的位置,即光标在哪里(按字符计数) f.readline()#读一行 pr ...

  9. c# 科学计数法值转换成正常值,返回字符串

    /// <summary> /// 科学计数法值转换成正常值 /// </summary> /// <param name="value">&l ...

  10. C#关系运算符

    一.C#关系运算符 C#语言的关系运算符是对操作数的比较运算. 二.示例 using System;using System.Collections.Generic;using System.Linq ...