codeforces #296 div2 (527C) STL中set的运用
题意:在一块H*M的玻璃上每次划一刀(仅仅能水平或竖直)。输出每次划开之后剩下的玻璃中面积最大的一块的面积。
做题的时候。觉得这么大的数据量,有每次查询输出,应该是数据结构的内容。
这道题能够用STL中的set容器来非常好地解决~set容器其本身就是用红黑树这样的数据结构来实现的。所以和原来的推測并不相悖。STL平时用的并不多。里面的一些函数非常生疏,熟悉一下
解题思路:
首先建立两个set型容器 ,每次分割都将分割的位置h或w插入到set中,因为set可以自己主动排序。运用两个函数lower_bound()和upper_bound()就行找到 和所插入的位置 前后相邻的两个已经被分割的位置,从而得到此次分割后新增的两个空间(见代码);
在建立两个set容器用来存最长的水平距离和最长的竖直距离,每次在插入两个新的距离元素的时候同一时候删除掉之前的大的距离元素。
另外。关于lower_bound()和upper_bound()函数:
关于rbegin() 和rend()
rbegin() 返回的是反转set之后第一个元素的位置,也就是说*rbegin() = set中最大的元素;
rend()同理。
他们的迭代器是:
multiset<int>::reverse_iterator
rit;
code:
#include <bits/stdc++.h> using namespace std;
typedef long long ll; int main() {
int W, H, N;
cin >> W >> H >> N;
set<int> h, w;
multiset<int> mh, mw;
h.insert(H); h.insert(0);
w.insert(W); w.insert(0);
mh.insert(H); mw.insert(W);
set<int>::iterator l, r;
while (N--) {
char c;
int x;
scanf(" %c %d", &c, &x);
if (c == 'H') {
l = h.lower_bound(x);///找到第一个 >= x的位置
r = l; l--;///迭代器向左移一个
h.insert(x);///插入新的分割线
mh.insert((*r)-x);///添加新的距离元素
mh.insert(x-(*l));///添加新的距离元素
mh.erase(mh.find((*r)-(*l)));///删除旧的距离元素
} else {
///以下凝视同上
l = w.lower_bound(x);
r = l; l--;
w.insert(x);
mw.insert((*r)-x);
mw.insert(x-(*l));
mw.erase(mw.find((*r)-(*l)));
}
///用最大的水平长度 * 最大的竖直长度 = 最大面积
ll ans = ((ll)(*mh.rbegin()) * (*mw.rbegin()));
printf("%lld\n", ans);
}
return 0;
}
codeforces #296 div2 (527C) STL中set的运用的更多相关文章
- Codeforces #180 div2 C Parity Game
// Codeforces #180 div2 C Parity Game // // 这个问题的意思被摄物体没有解释 // // 这个主题是如此的狠一点(对我来说,),不多说了这 // // 解决问 ...
- Codeforces #541 (Div2) - E. String Multiplication(动态规划)
Problem Codeforces #541 (Div2) - E. String Multiplication Time Limit: 2000 mSec Problem Descriptio ...
- Codeforces #548 (Div2) - D.Steps to One(概率dp+数论)
Problem Codeforces #548 (Div2) - D.Steps to One Time Limit: 2000 mSec Problem Description Input Th ...
- [Codeforces 1246B] Power Products (STL+分解质因数)
[Codeforces 1246B] Power Products (STL+分解质因数) 题面 给出一个长度为\(n\)的序列\(a_i\)和常数k,求有多少个数对\((i,j)\)满足\(a_i ...
- 【Codeforces #312 div2 A】Lala Land and Apple Trees
# [Codeforces #312 div2 A]Lala Land and Apple Trees 首先,此题的大意是在一条坐标轴上,有\(n\)个点,每个点的权值为\(a_{i}\),第一次从原 ...
- STL中的set容器的一点总结
1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构 ...
- STL中的next_permutation
给定一个数组a[N],求下一个数组. 2 1 3 4 2 1 4 3 2 3 1 4 2 3 4 1 ..... 在STL中就有这个函数: 1.参数是(数组的第一个元素,数组的末尾),注意这是前闭后开 ...
- 3.2 STL中的函数对象类模板
*: STL中有一些函数对象类模板,如下所示: 1)例如要求两个double类型的x 和y 的积,可以: multiplies<double>()(x,y); 该表达式的值就是x*y的值. ...
- C++的模板特化 和 STL中iterator_traits模板的偏特化
C++中有类模板和函数模板,它们的定义如下所示: 类模板: template<class T1,class T2> class C { //... }; 函数模板: template< ...
随机推荐
- 图解vue中 v-for 的 :key 的作用,虚拟dom Diff算法
其实不只是vue,react中在执行列表渲染时也会要求给每个组件添加上key这个属性. 要解释key的作用,不得不先介绍一下虚拟DOM的Diff算法了. 我们知道,vue和react都实现了一套虚拟D ...
- HTML-<td> 标签的 valign 属性
<html> <body> <table border="1" style="height:200px"> <tr&g ...
- Jacoco覆盖率工具使用调研
JaCoCo Java Code Coverage Library Jacoco是一个开源的覆盖率工具.Jacoco可以嵌入到Ant .Maven中,并提供了EclEmma Eclipse插件,也可以 ...
- 免费的HTML商业模板-Hidayah
在线演示 在线演示 本地下载 在这款模板中,你可以随意缩放大小,适合笔记本.平板电脑或手机,非常方便阅读.
- 调整WebLogic的时间
控制台显示的时区为GMT,于是考虑调整WebLogic的时区,查询WebLogic的相关参数后,初步的调整方式为:修改相关域下的bin目录中的startWebLogic.cmd脚本.添加"- ...
- 检查许可证所需的adobe application manager 丢失或损坏
安装Adobe公司的一般都需要账号,记得以前安装Flex也是,这里提供一个公用账号: 帐号:992829179@qq.com 密码:521521 在安装Acrobat_Ⅺ_Pro_11.0.03后,弹 ...
- angular cli中的--flat参数
添加--flat 参数,表示不创建单独的目录 例如 ng g c news/news-detail 会将文件创建在app/news/news-detail目录下 ng g c news/news-de ...
- PHP 表单 - 5(完整表单实例)
PHP 完整表单实例 本章节将介绍如何让用户在点击"提交(submit)"按钮提交数据前保证所有字段正确输入. PHP - 在表单中确保输入值 在用户点击提交按钮后,为确保字段值是 ...
- axios 请求参数配置说明
axios的配置项地址参考: https://www.npmjs.com/package/axios { // `url` is the server URL that will be used fo ...
- js 垃圾回收机制与内存管理
1.原理 js按照固定的时间间隔找到不在继续使用的变量,释放其占用的内存. 2.实现方式 (1)标记清除 垃圾收集器给存储在内存上的所有变量都加上标记: 之后,去掉环境中的变量以及被环境引用变量的标记 ...