UOJ #206. 【APIO2016】Gap

Description

1146405-20180420195214328-659696352.png

Solution

第一个子任务,直接从 \((a[i],a[j])\) 推出 \((a[i+1],a[j-1])\) 就行了,只需要 \(\frac{N+1}{2}\)
第二个子任务,首先答案至少是 \(\lceil\frac{max-min}{N-1}\rceil\)
然后我们就只关心长度大于 \(ans\) 的区间了,每一次扩展下去,就可以遍历到所有相邻点,更新一下答案
每一个点刚好贡献两次,加上刚开始找 \(max\)\(min\) 的次数刚好是 \(3*N\)

#include "gap.h"
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
ll a[N],inf=1e18;
long long findGap(int T, int n)
{
    if(T==1){
        ll ans=0;
        a[0]=-1;a[n+1]=inf+10;
        for(int l=1,r=n;l<=r;l++,r--)
            MinMax(a[l-1]+1,a[r+1]-1,&a[l],&a[r]);
        for(int i=2;i<=n;i++)ans=max(ans,a[i]-a[i-1]);
        return ans;
    }
    else{
        ll l=0,r=inf,last=-1;
        MinMax(l,r,&l,&r);
        ll ans=(r-l+n-2)/(n-1);
        for(ll i=l;i<=r;){
            ll s=i,t=i+ans;
            MinMax(s,t,&s,&t);i+=ans+1;
            if(last!=-1 && s!=-1)ans=max(ans,s-last);
            if(t!=-1)last=t;
        }
        return ans;
    }
}

转载于:https://www.cnblogs.com/Yuzao/p/8893356.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值