CodeForces 527C - Glass Carving set multiset 二分

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值