http://codeforces.com/problemset/problem/527/C
/*
http://blog.csdn.net/u011580493/article/details/44457477
题意:
对于一个矩形,宽为w,高为h。现在对其进行一系列的切割。让你求出每次切割后的最大面积的矩形。
思路:
set:内部已经有序,记录已经切割了的位置。
multiset:内部已经有序,记录切割出来的长度。
lower_bound(val):返回第一个>=val的数的位置。(二分)
每次切割的时候,在set里面寻找最近左右两侧所切割的位置,再把新的切割位置插入到set,可以得到该段的长度。
然后在multiset里找到这个长度erase掉(可能有多个,只需要删除一个),再把切割后的得到两个长度插入multiset。最大面积等于最大的宽度*最大的高度,搞定。
*/
#include<bits/stdc++.h>
using namespace std;
const int MAX=200005;
int W,H,N;
set<int> S[2];
multiset<int> MS[2];
long long Solve(int t,int val)
{
set<int>::iterator it=S[t].lower_bound(val);
int r=*it,l=*(--it);
S[t].insert(val);
MS[t].insert(r-val),MS[t].insert(val-l);
MS[t].erase(MS[t].find(r-l));
return (long long)(*MS[t].rbegin())*(*MS[t^1].rbegin());
}
int main()
{
cin.sync_with_stdio(false);
cin>>W>>H>>N;
S[0].insert(0),S[0].insert(H);
S[1].insert(0),S[1].insert(W);
MS[0].insert(H),MS[1].insert(W);
char ch;
int val;
for (int i=1;i<=N;i++)
{
cin>>ch>>val;
cout<<(ch=='H'?Solve(0,val):Solve(1,val))<<endl;
}
return 0;
}
CodeForces 527C - Glass Carving set multiset 二分
最新推荐文章于 2021-09-22 17:38:20 发布