题意:一块玻璃给定长宽 h,w,给定割玻璃操作次数n,接下来n行给出操作H或V来进行水平或竖直切割,输出每割完一次所切割出的长方形区域中最大的面积。
思路:想到利用multiset(可存储相同元素)存储所割长宽间距,利用set存储被切横纵坐标,(insert&erase进行操作),因为set特性,集合内自动排序,利用end()取出长宽间距最大值,相称为最大面积。此处要注意数据范围,s应用long(long long),相乘长宽也应用long。
代码如下:
#include <cstdio>
#include <set>
#include <algorithm>
using namespace std;
int main()
{
int w,h,n;
int d,l,r;
char c;
int i;
long long s,mw,mh;
set <int> x,y; //储存割线坐标
multiset <int> dx,dy; //储存各间距长宽
set <int>::iterator it;
scanf("%d%d%d",&w,&h,&n);
x.insert(0);x.insert(w);
y.insert(0);y.insert(h);
dx.insert(w);
dy.insert(h);
for(i=0;i<n;i++){
scanf(" %c%d",&c,&d); //注意字符的读取!!!
switch(c){
case 'H':
y.insert(d);
it=y.find(d);
r=*(++it);
l=*(----it);
it=dy.find(r-l);
dy.erase(it); //set对应insert,erase
dy.insert(r-d);
dy.insert(d-l);
break;
case 'V':
x.insert(d);
it=x.find(d);
r=*(++it);
l=*(----it);
it=dx.find(r-l); //set中erase要如此操作
dx.erase(it); //set对应insert,erase
dx.insert(r-d);
dx.insert(d-l);
break;
}
mw=*(--dx.end());
mh=*(--dy.end()); //set内自有顺序
s=mw*mh; //mw与mh也应是lld!!!
printf("%lld\n",s);
}
return 0;
}