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< ...
随机推荐
- Cognos中新建SQLserver数据源的步骤
1:配置-数据源连接-新建数据源-指定数据源名称 2:选择数据库类型,暂时不配置jdbc 3:指定服务器,数据库名称,登陆用户名和密码 4:测试 5:测试OK(OLE DB类型的) 6:返回上一步 , ...
- [Webpack] Analyze a Production JavaScript Bundle with webpack-bundle-analyzer
Bundle size has a huge impact on JavaScript performance. It's not just about download speed, but all ...
- 【Python】得到当前日期时间
import time str=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) print(str)
- 在Fedora10上安装MySQL5.0.18,告捷!
又一次安MySQL了,为什么又呢,因为前面成功那次算配置,即配置Fedora10自带的MySQL,这个还不算自己安装的,所以有必要再安装一次,以后还装也有可能,换操作系统,换MySql版本都可能这样做 ...
- Office WORD如何设置表格背景颜色
1 点击表格-表格属性,边框和底纹. 2 选择应用于段落,这样只会应用于问题,效果不好. 3 选择应用于单元格可以避免上面的问题.
- git命令 add -a和add .和add -u 的区别
总结: git add -a 所有的更改操作--新建,更改,删除: git add . 只包括 新建 ,修改操作:无删除: git add -u 只包括修改,删除操作,无新建: 示例: git ini ...
- cocos2d 重写顶点着色语言
bool CCShaderSprite::initWithFile( const char *pszFilename ) { bool ret=false; do { ret=CCSpri ...
- Nhibernate Criteria 多个or条件查询
sql: select * from table t where (t.name like '%张三%' or t.schoolName like '%张三%' or t.cityname like ...
- Laravel.log日志超级大!怎么办!
备份项目,发现下载好久没有下载下来.提了网速还是下载了45分钟 解压,解压了25分钟. 想着以为是附件太多... 进入了upload发现也就几百兆. 想看里面内容又打不开... Laravel 的日 ...
- win7 mtp
Sensors MTP Monitor Service 允许MTP设备数据传输,如果该服务被禁用,MTP监视器将不能工作.该服务的默认运行方式是手动,如果你没有使用MTP设备,该功能就可以放心禁用. ...