1562 玻璃切割
题目来源: CodeForces
基准时间限制:1.5 秒 空间限制:131072 KB 分值: 20 难度:3级算法题
现在有一块玻璃,是长方形的(w 毫米× h 毫米),现在要对他进行切割。

切割的方向有两种,横向和纵向。每一次切割之后就会有若干块玻璃被分成两块更小的玻璃。在切割之后玻璃不会被移动。

现在想知道每次切割之后面积最大的一块玻璃是多少。

样例解释:

对于第四次切割,下面四块玻璃的面积是一样大的。都是2。

Input
单组测试数据。
第一行有三个整数 w,h,n (2≤w,h≤200000, 1≤n≤200000),表示玻璃在横向上长w 毫米,纵向上长h 毫米,接下来有n次的切割。
接下来有n行输入,每一行描述一次切割。
输入的格式是H y 或 V x。
H y表示横向切割,切割线距离下边缘y毫米(1≤y≤h-1)。
V x表示纵向切割,切割线距离左边缘x毫米(1≤x≤w-1)。
输入保证不会有两次切割是一样的。
Output
对于每一次切割,输出所有玻璃中面积最大的是多少。
Input示例
样例输入1
4 3 4
H 2
V 2
V 3
V 1
Output示例
样例输出1
8
4
4

这题我们只有一个需要思考的点,那就是什么切割了多次之后怎样的一块面积最大?
我们可以想到横向最宽,纵向最高的面积一定是最大的。

然后要注意的一点是,横向和纵向处理很容易把人弄晕,
可以先考虑线段的情况,问题变成了,一条线段,切割之后最长的子线段为多少?
求出一个维度之后复制粘贴变成2维的即可。

写起来很绕,需要很强的编码能力,不过这与问题的解决办法已经无关了。

代码:

#include <iostream>
#include <algorithm>
#include <map>
#include <vector>
#include <set>
#include <math.h>
#include <queue>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
typedef long long ll;
#define INF 2147483647//输入
int w, h, n;//mh:高度方向上每个间隔出现的次数。mh[i] = j表示间隔为i的线段有j个。
//mv:宽度方向上每个间隔出现的次数。mv[i] = j表示间隔为i的线段有j个。
//h1: h1[i] = j表示高度方向上切割点为i的线段的长度为j。
//v1: v1[i] = j表示宽度方向上切割点为i的线段的长度为j。
map <int, int> mh, mv, h1, v1;
map <int, int>::iterator it, it1;int main() {scanf("%d%d%d", &w, &h, &n);//初始化,长度为h的线段+1,长度为w的线段+1,以0为起点的线段长为h,以0为起点的线段长为w。 mh[h] = 1;mv[w] = 1;h1[0] = h;v1[0] = w;char k1;int k2;while (n--) {getchar();scanf("%c%d", &k1, &k2);if (k1 == 'H') {//找到切割点前一个点的位置和长度。 it = h1.lower_bound(k2); it--;int con = it->first;int len = it->second;//长度为len的线段-1,如果为0了就从map中删掉 mh[len]--;if (mh[len] == 0) mh.erase(len);//h1: h1[i] = j表示高度方向上切割点为i的线段的长度为j。h1[con] = k2 - con;h1[k2] = len - h1[con];//mh:高度方向上每个间隔出现的次数。mh[i] = j表示间隔为i的线段有j个。 mh[h1[k2]]++;mh[h1[con]]++;}else if (k1 == 'V') {it = v1.lower_bound(k2); it--;int con = it->first;int len = it->second;mv[len]--;if (mv[len] == 0) mv.erase(len);v1[con] = k2 - con;v1[k2] = len - v1[con];mv[v1[k2]]++;mv[v1[con]]++;}//map最后一个值的key最大 it = mh.end(); it--;it1 = mv.end(); it1--;ll p = it->first;ll q = it1->first;printf("%lld\n", p*q);}getchar(); getchar();return 0;
}
/*
10 10 5
H 1
H 8
H 6
H 2
H 4
*/

51nod 1562 玻璃切割 (STL map+一点点的思考)相关推荐

  1. 51nod-1562:玻璃切割(O(n)模拟)

    1562 玻璃切割 题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 现在有一块玻璃,是长方形的(w 毫米× h ...

  2. C++ 笔记(24)— STL map 类(map实例化、插入、查找、删除)

    1. STL 映射类简介 map 和 multimap 是键-值对容器,支持根据键进行查找,区别在于,后者能够存储重复的键,而前者只能存储唯一的键. 为了实现快速查找, STL map 和 multi ...

  3. STL map 简介

    STL map 简介 转载于:http://www.cnblogs.com/TianFang/archive/2006/12/30/607859.html 1.目录 map简介 map的功能 使用ma ...

  4. 结构体作为STL map的key时需要注意什么? (某公司招聘面试试题)已跪~~~~(_)~~~~

    某公司招聘的面试环节, 有这样一个题目:结构体作为STL map的key时需要注意什么? 对于懂STL map的同学来说, 这个题目还是比较easy的, 先看程序: #include <iost ...

  5. Dictionary,hashtable, stl:map有什么异同?

    Dictionary,hashtable, stl:map有什么异同? 相同点:字典和map都是泛型,而hashtable不是泛型. 不同点:三者算法都不相同 Hashtable,看名字能想到,它是采 ...

  6. C++ STL map的使用

    C++ STL map的使用   2009-12-11 作者:tanker1024 来源:tanker1024的blog   1.map简介 map是一类关联式容器.它的特点是增加和删除节点对迭代器的 ...

  7. 学习STL map, STL set之数据结构基础

    STL map和set的使用虽不复杂,但也有一些不易理解的地方,如: 或许有得人能回答出来大概原因,但要彻底明白,还需要了解STL的底层数据结构. C++ STL 之所以得到广泛的赞誉,也被很多人使用 ...

  8. STL map与Boost unordered_map - 有何不可的日志 - 网易博客

    STL map与Boost unordered_map - 有何不可的日志 - 网易博客 STL map与Boost unordered_map 2012-03-30 16:06:26|  分类: c ...

  9. STL map 内存改变,迭代器失效,_Isnil(_Ptr)和红黑树

    STL map 内存改变,迭代器失效,_Isnil(_Ptr)和红黑树 最近在做项目时发现一个crash的问题,当时得到的dmp文件显示crash在一个以map为循环变量的循环中,crash位置在如下 ...

最新文章

  1. 使用PlantText画时序图分析业务流程
  2. linux 没权限dev null,Linux mint cinnamon 64位找不到/dev/null
  3. 腾讯开源首个医疗AI项目,业内首个3D医疗影像大数据预训
  4. SAP Spartacus HTTP请求url里的语言和货币参数是如何加上去的
  5. Java Spring源代码学习之DispatcherServlet.getHandler
  6. Python update 函数 - Python零基础入门教程
  7. 缺芯下的新造车“月考”成绩单来了!
  8. 【编程珠玑】第四章 编写正确的程序
  9. 2012第50周星期日
  10. 电子设计竞赛控制组——完整旋转倒立摆程序
  11. 高等数学第七版pdf
  12. 为鼓励居民节约用水,自来水公司采取按月用水量分段计费的办法,居民应交水费y(元)与月用水量x(吨)的函数关系式如下(设x>0)。编写程序,输入用户的用水量x(吨),计算并输出用户应该支付的水费y(元)
  13. 湖北文理学院毕业论文(设计)任务书
  14. quartus软件使用—error:top-level design entity “xxx” is undefined
  15. linux 在固定网址yum,linux yum介绍
  16. 计算机房电磁辐射防护,机房防辐射处理解决方案
  17. oracle spatial java 类库,Java插入Oracle Spatial空间数据
  18. 基于Opencv的人脸&姓名&表情&年龄&种族&性别识别系统(源码&教程)
  19. Linux内核如何私闯进程地址空间并修改进程内存
  20. 十只老鼠在1000瓶药水中找一瓶有毒的

热门文章

  1. python中messagebox用法实例_pyqt4教程之messagebox使用示例分享
  2. Java黑皮书课后题第6章:*6.39(几何:点的位置)编程练习题3.32显示如何测试一个点是否在一个有向直线的左侧、右侧或在直线上,编写一个程序,输入三个点p0p1p2,显示p2是否在直线p0p1
  3. php laravel paginate,laravel 8 修改默认的paginate分页样式 的方法可以很简单
  4. Halcon Example - 圆弧测量对象的使用
  5. [BZOJ3932][CQOI2015]任务查询系统(差分+主席树)
  6. C#数组 动态添加元素
  7. 《VC++深入详解》学习笔记 第一章 Windows程序内部运行机制
  8. MongoDB数据导入hbase + 代码
  9. Codeforce 水题报告(2)
  10. winform中关于panel中滚动条和键盘事件几点体会