51nod 1562 玻璃切割 (STL map+一点点的思考)
现在有一块玻璃,是长方形的(w 毫米× h 毫米),现在要对他进行切割。
切割的方向有两种,横向和纵向。每一次切割之后就会有若干块玻璃被分成两块更小的玻璃。在切割之后玻璃不会被移动。
现在想知道每次切割之后面积最大的一块玻璃是多少。
样例解释:

对于第四次切割,下面四块玻璃的面积是一样大的。都是2。
单组测试数据。
第一行有三个整数 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)。
输入保证不会有两次切割是一样的。
对于每一次切割,输出所有玻璃中面积最大的是多少。
样例输入1
4 3 4
H 2
V 2
V 3
V 1
样例输出1
8
4
4
#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+一点点的思考)的更多相关文章
- 51nod 1562 玻璃切割
1562 玻璃切割 http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1562 题目来源: CodeForces 基准时间 ...
- 51nod 1562 玻璃切割 (set)
#include<stdio.h> #include<iostream> #include<set> using namespace std; typedef lo ...
- AC日记——玻璃切割 51nod 1562
玻璃切割 思路: 并查集: 离线操作: 先把每次切割都存下来: 然后从后面不断合并切割: 然后每次更新最大长和宽: 记录答案: 要开longlong: 来,上代码 #include <cstdi ...
- stl::map之const函数访问
如何在const成员数中访问stl::map呢?例如如下代码: string ConfigFileManager::MapQueryItem(const string& name) const ...
- hdu4941 Magical Forest (stl map)
2014多校7最水的题 Magical Forest Magical Forest Time Limit: 24000/12000 MS (Java/Others) Memory Limit ...
- [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 ...
- STL MAP及字典树在关键字统计中的性能分析
转载请注明出处:http://blog.csdn.net/mxway/article/details/21321541 在搜索引擎在通常会对关键字出现的次数进行统计,这篇文章分析下使用C++ STL中 ...
- POJ 3096 Surprising Strings(STL map string set vector)
题目:http://poj.org/problem?id=3096 题意:给定一个字符串S,从中找出所有有两个字符组成的子串,每当组成子串的字符之间隔着n字符时,如果没有相同的子串出现,则输出 &qu ...
- STL MAP 反序迭代
ITS_NOTICE_MAP::reverse_iterator it = noticeMap.rbegin(); for ( ; it != noticeMap.rend(); ++it ) { I ...
随机推荐
- Struts2简单环境搭建
一.开篇 Struts2是一个运行于web容器的表示层框架,其核心作用是帮助我们处理Http请求.Struts2处理Http请求(Request),并进行内部处理,再进行Http返回. 下载strut ...
- form&input
<form action="http://www.baidu.com" method="post" autocomplete="on" ...
- 小白向:web中利用request.getPart()上传文件到服务器
被文件上传弄得焦头烂额的一天,果然web中的路径和各种设置真的好讨厌= = 下面是超级小白的.及其简约的“详”解 1.明确目的: 用户将 1.txt 文件 上传到 服务器(web工程下的某个文件夹)中 ...
- Android 高大上的侧滑菜单DrawerLayout,解决了不能全屏滑动的问题
DrawerLayout预览 DrawerLayout主要功能就是 实现侧滑菜单效果的功能,并且可以通过增加一些设置来实现高大上的效果,那么就请看动态图: 注意左上角那个图标,有木有很好玩,哈哈. ...
- 我的nginx+php是如何配置的?
nginx使用homebrew安装,安装之后 ngxin 安装目录:/usr/local/Cellar/nginx/1.8.0 删除掉默认的www目录,创建一个自己方便找到的 删除掉默认的www目录 ...
- DDD中 与Dto搭配的AutoMapper插件,摘自《NET企业级应用架构设计》
AutoMapper插件 实现了 DTO与Model的互相映射.
- LeetCode Golang 9.回文数
9. 回文数 第一种办法 :itoa 转换为字符串进行处理: package main import ( "strconv" "fmt" ) //判断一个整数是 ...
- [luogu2607 ZJOI2008] 骑士 (树形dp)
题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里, ...
- [剑指offer] 8+9. 跳台阶+变态跳台阶 (递归 时间复杂度)
跳台阶是斐波那契数列的一个典型应用,其思路如下: # -*- coding:utf-8 -*- class Solution: def __init__(self): self.value=[0]*5 ...
- StringUtils 的填充方法
注意:两个参数的用空格填充,三个参数的用后面的参数填充 第一个参数要填充的字符串,第二个是需要的长度,第三个是以什么填充. 左侧填充: leftPad(): StringUtils.leftPad(S ...