SPOJ - ADAFIELD ,Set+map,STL不会超时!

                                ADAFIELD - Ada and Field

 这个题,如果用一个字来形容的话:-----------------------------------------------嗯!

 题意:n*m的空白矩形坐落在XY轴,Q次操作,每次可以在y轴或x轴的矩形区域内画一条直线,是直线啊。问每次操作后最大的矩形面积多大。

  对于思路我只能拍手称赞了,一开始想不到怎么优化,想着用优先队列或set来存当前边的最大值,但是更新的时候却 无法实时更新。赛后看其他选手的代码才突然想到可以用map的键值来排序,每次插入一个数只需断一条边加两条边,各种操作的的复杂度都是log。

int main()
{
    int t,Q,k;
    ll n,m,p,maxx[2];
    scanf("%d",&t);
    while(t--)
    {
        scanf("%I64d%I64d%d",&n,&m,&Q);
        set<ll>q[2];
        set<ll>::iterator it,lp,rp;
        map<ll,ll,greater<ll> >qq[2];
        q[0].insert(0),q[0].insert(n);//0表示竖直方向插入
        q[1].insert(0),q[1].insert(m);//1表示水平方向插入
        ++qq[0][n],++qq[1][m];
        maxx[0]=n,maxx[1]=m;
        while(Q--)
        {
            scanf("%d%I64d",&k,&p);
            if(q[k].find(p)==q[k].end())
            {
                q[k].insert(p);
                it=q[k].lower_bound(p);
                lp=rp=it;
                rp++;//后一个的值
                if(lp!=q[k].begin()) lp--;//前一个的值
                if(rp==q[k].end()) rp--;
                ++qq[k][*rp-*it];//更新
                ++qq[k][*it-*lp];
                --qq[k][*rp-*lp];//删去原来的
                if(!qq[k][*rp-*lp]) qq[k].erase(*rp-*lp);//特别需要注意的地方
                maxx[k]=qq[k].begin()->first;
            }
            cout<<maxx[0]*maxx[1]<<endl;
        }
    }
    return 0;
}


ADAFIELD - Ada and Field

转载于:https://www.cnblogs.com/nyist-TC-LYQ/p/7208074.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值