CodeForces528A Glass Carving

题意:告诉一块玻璃长宽,长宽小于200000, Q个询问每次横向或者纵向切割,每次询问输出最大的玻璃面积

题解:一开始想顺着做,发现行不通,可以倒过来想,每次合并两个,最大值只可能是合并的这两个或者是原序列的最大值,这里用set代替链表

#include <bits/stdc++.h>
#define ll long long
#define maxn 200100
using namespace std;
set<ll >hh, ww;
char ch[maxn];
ll a[maxn], b[maxn], ans[maxn];
int main(){
    ll h, w, n, t, temp, mx, numa = 0,numb = 0, t1, t2;
    scanf("%lld%lld%lld", &w, &h, &n);
    for(ll i=0;i<n;i++){
        getchar();
        scanf("%c%lld", &ch[i], &a[i]);
        if(ch[i] == 'H') hh.insert(a[i]);
        else ww.insert(a[i]);
    }
    hh.insert(0);hh.insert(h);
    ww.insert(0);ww.insert(w);
    ll mxh=0,mxw=0;
    auto it = hh.begin();
    while(1){
        auto ito = it; ito++;
        if(ito == hh.end()) break;
        mxh = max(mxh, *ito-*it);
        it = ito;
    }
    auto it1 = ww.begin();
    while(1){
        auto ito = it1; ito++;
        if(ito == ww.end()) break;
        mxw = max(mxw, *ito-*it1);
        it1 = ito;
    }
    ans[n-1] = mxh*mxw;
    for(ll i=n-1;i>=0;i--){
        if(ch[i] == 'H'){
            auto it = hh.lower_bound(a[i]);
            mxh = max(mxh, *(++it)-*(----it));
            hh.erase(a[i]);
            ans[i-1] = mxh*mxw;
        }
        else {
            auto it = ww.lower_bound(a[i]);
            t = *(++it)-*(----it);
            mxw = max(mxw, t);
            ww.erase(a[i]);
            ans[i-1] = mxh*mxw;
        }
    }
    for(ll i=0;i<n;i++) printf("%lld\n", ans[i]);
    return 0;
}

 

转载于:https://www.cnblogs.com/Noevon/p/7501006.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值