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< ...
随机推荐
- 解决IP地址冲突
1.重新启动路由器就可以. 要是网络上的每一个设备都被分配了动态IP地址,路由器重新启动.又一次分配IP地址给网络上的每一个设备后,这个问题就有望得到解决. 可是假设是在企业内就不可能随便的重新启动公 ...
- URAL 1748
题目大意:找出T组不大于ni(i=1,2,3,...,T)的因子数最多的数mi(i=1,2,3,...,T),有多个数时输出最小的. KB 64bit IO Format:%I64d & ...
- 一次真实的蓝屏分析 ntkrnlmp.exe
故事背景: 话说我一直都是远程公司的电脑,在我晚上11点敲代码敲得正爽的时候,被远程的主机挂掉了,毫无征兆的挂掉了,我特么还好有闲着没事就ctrl + s保存代码的习惯,要不然白敲了那么久,我以为是公 ...
- Visual Studio 2008破解90天试用期
Visual Studio 2008破解90天试用期变成正式版的方法: 第一种方法(安装前用): 把iso文件中的setup文件夹中的setup.sdb文件中的[Product Key]下的一行的原来 ...
- 执行Socket socket = new Socket(ip, port);时抛出个异常:android.os.NetworkOnMainThreadException解决办法
首先,确认你的android版本是4.0之后再用此方法解决,因为在4.0之后在主线程里面执行Http请求才会报这个错,也许是怕Http请求时间太长造成程序假死的情况吧.Android在4.0之前的版本 ...
- MySQL Cluster线上管理节点配置文件-数据节点32G内存
网上的朋友提供的,仅供参考. [NDBD DEFAULT] NoOfReplicas= 2 DataMemory=20G IndexMemory=5G MaxNoOfConcurrentTransac ...
- vscode - 设置中文语言
记得上次安装的时候,自动提示安装本地语言包,现在的版本貌似不会了吧. 1.先安装扩展,按键CTRL+SHIFT+P 输入 ext install ,最后输入:language,大概就可以找到简体中文包 ...
- php之快速入门学习-10(数组)
PHP 数组 数组能够在单个变量中存储多个值: <?php $cars=array("Volvo","BMW","Toyota"); ...
- ASP.NET MVC+Bootstrap 实现短信验证
短信验证大家都已经非常熟悉了,基本上每天都在接触手机短信的验证码,比方某宝,某东购物.站点注冊,网上银行等等,都要验证我们的手机号码真实性.这样做有什么优点呢. 曾经咱们在做站点的时候.为了提高用户注 ...
- 美国程序猿(软件project师)平均年薪状况调查
来源站点:Indeed.com&computerengineeringsalarydata.com Average Software Engineer Salary by 50 States ...