STL F CodeForces527C 割玻璃 set

9 篇文章 0 订阅

题意:一块玻璃给定长宽 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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值