题意:给你一个w*h 的玻璃,有n个操作,在第几行画线或者在第几列划线分层小块,每次操作后问小块中的最大面积
分析:multiset<LL> H,v,a1,a2; H是存的划线的高度的id,v的每次画竖线的id。a1存H的差值,a2存v的差值
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <string.h>
#include <map>
#include <set>
using namespace std;
#define maxn 100005*2
#define inff 0x7FFFFFFFFFFFFFFF
typedef long long int LL;
LL w,h,n;
int main()
{
LL i;
char str[2];
multiset<LL>H;
multiset<LL>v;
multiset<LL>a1;
multiset<LL>a2;
multiset<LL>::iterator it,iter,indx;
while(scanf("%lld%lld%lld",&w,&h,&n)!=EOF)
{
H.clear(); v.clear();a1.clear(); a2.clear();
H.insert(0);
H.insert(h);
v.insert(0);
v.insert(w);
a1.insert(h);
a2.insert(w);
for(i=1;i<=n;i++)
{
LL id;
scanf("%s%lld",str,&id);
if(str[0]=='H')
{
it=H.upper_bound(id);
LL gao=*it;
LL di=*(--it);
LL cha=gao-di;
H.insert(id);
indx=a1.find(cha);
if(indx!=a1.end())
a1.erase(indx);
a1.insert(id-di);
a1.insert(gao-id);
it=a1.end();it--;
iter=a2.end();iter--;
LL ans1=*it;
LL ans2=*iter;
printf("%lld\n",ans1*ans2);
}
else
{
it=v.upper_bound(id);
LL gao=*it;
LL di=*(--it);
v.insert(id);
LL cha=gao-di;
indx=a2.find(cha);
if(indx!=a2.end())
a2.erase(indx);
a2.insert(id-di);
a2.insert(gao-id);
it=a1.end();it--;
iter=a2.end();iter--;
LL ans1=*it;
LL ans2=*iter;
printf("%lld\n",ans1*ans2);
}
}
}
return 0;
}