CodeForces 527C Glass Carving(multiset)

题意:给你一个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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值