题目来源: 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] = ;
mv[w] = ;
h1[] = h;
v1[] = 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] == ) 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] == ) 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 ;
}
/*
10 10 5
H 1
H 8
H 6
H 2
H 4
*/

51nod 1562 玻璃切割 (STL map+一点点的思考)的更多相关文章

  1. 51nod 1562 玻璃切割

      1562 玻璃切割 http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1562 题目来源: CodeForces 基准时间 ...

  2. 51nod 1562 玻璃切割 (set)

    #include<stdio.h> #include<iostream> #include<set> using namespace std; typedef lo ...

  3. AC日记——玻璃切割 51nod 1562

    玻璃切割 思路: 并查集: 离线操作: 先把每次切割都存下来: 然后从后面不断合并切割: 然后每次更新最大长和宽: 记录答案: 要开longlong: 来,上代码 #include <cstdi ...

  4. stl::map之const函数访问

    如何在const成员数中访问stl::map呢?例如如下代码: string ConfigFileManager::MapQueryItem(const string& name) const ...

  5. hdu4941 Magical Forest (stl map)

    2014多校7最水的题   Magical Forest Magical Forest Time Limit: 24000/12000 MS (Java/Others)    Memory Limit ...

  6. [CareerCup] 13.2 Compare Hash Table and STL Map 比较哈希表和Map

    13.2 Compare and contrast a hash table and an STL map. How is a hash table implemented? If the numbe ...

  7. STL MAP及字典树在关键字统计中的性能分析

    转载请注明出处:http://blog.csdn.net/mxway/article/details/21321541 在搜索引擎在通常会对关键字出现的次数进行统计,这篇文章分析下使用C++ STL中 ...

  8. POJ 3096 Surprising Strings(STL map string set vector)

    题目:http://poj.org/problem?id=3096 题意:给定一个字符串S,从中找出所有有两个字符组成的子串,每当组成子串的字符之间隔着n字符时,如果没有相同的子串出现,则输出 &qu ...

  9. STL MAP 反序迭代

    ITS_NOTICE_MAP::reverse_iterator it = noticeMap.rbegin(); for ( ; it != noticeMap.rend(); ++it ) { I ...

随机推荐

  1. dozer初探

    简介 Dozer是一款javaBean的映射工具,用于解决一个类到另外一个类的自动适配功能,它即支持简单的映射,也支持复杂类型的双向递归映射(官网). 示例 举个例子,假设说我们现在有User(用户) ...

  2. Ubuntu下推荐安装软件

    前言:都是全平台软件,通用性好. 1.搜狗输入法 官网下载: 不能双击.deb安装成功,需要安装依赖,可参考:https://www.cnblogs.com/chendeqiang/p/1017741 ...

  3. WIN7把任务栏的的蓝牙图标误删了找回方法

    当时我删了以后,在网上找方法,都说—— 点击任务栏下面的三角箭头,选择自定义,里面有蓝牙图标选项,选择显示图标和通知. 可是我发现我的自定义选项里面就没有蓝牙图标选项啊... 故事的最后,我终于找到了 ...

  4. Markdown标记语言

    Markdown 是一种轻量级标记语言,创始人为约翰·格鲁伯(John Gruber).它允许人们“使用易读易写的纯文本格式编写文档,然后转换成有效的XHTML(或者HTML)文档”.这种语言吸收了很 ...

  5. 大数据之R语言速成与实战

    什么是R语言? R语言由新西兰奥克兰大学的Ross Ihaka和Robert Gentleman两人共同发明.其词法和语法分别源自Scheme和S语言. R定义:一个能够自有有效的用于统计计算和绘图的 ...

  6. uva 11300 Spreading the Wealth_数学推倒 + 思维

    这道题和负载平衡问题是同一道题, 如果 n<=100n <= 100n<=100 的话是可以用最小费用流来求解的. 但是题中 nnn 最大可达到 10610^6106, 这就需要我们 ...

  7. Pyhton学习——Day6

    # def test(x) : #形参:不占内存空间,调用函数时传入值,程序完成形参释放内存# # 注释内容# # 代码内容# y = x*2# print(y)# # return# # test( ...

  8. vue项目初始化步骤

    项目初始化:() 1. 安装vue-cli :    npm install -g vue-cli 2.初始化项目:   vue init webpack  my-project 3.进入项目:  c ...

  9. cron 和anacron 、日志转储的周期任务

    一.cron是开机自动启动的 [root@localhost ~]# chkconfig --list | grep "cron" crond 0:off 1:off 2:on 3 ...

  10. mybatis中sql标签和include标签

    1.首先定义一个sql标签,一定要定义唯一id.(name,age是要查询的字段) <sql id="Base_Column_List" >name,age</s ...