UOJ 206 [APIO2016]Gap

构造

第一个子任务就从外往内两个两个地确定即可。

第二个子任务,发现如果我们类似上面地把每一个数都确定下来,至少也要N/2级别的询问,而询问代价还有一个k,因此不能直接确定所有数字。那就是要忽略一些数字,发现答案的下界是 ana1n1 ,因此把 a1 an 每下界长度分一块,块内就不用管了。只有块之间有贡献。

#include "gap.h"
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef double db;
const ll INF = 1000000000000000000ll;
long long findGap(int T, int n)
{
    if(T == 1)
    {
        ll a1, an, l, r, ans = 0;
        MinMax(0,INF,&a1,&an); 
        for(int i = n-2; i > 0; i -= 2)
        {
            MinMax(a1+1,an-1,&l,&r);
            ans = max(ans, max(l-a1, an-r));
            a1 = l, an = r;
        }
        ans = max(ans, an-a1);
        return ans;
    }
    else
    {
        ll a1, an, down, last, ans = 0, i, l, r;
        MinMax(0,INF,&a1,&an); last = a1;
        down = (ll)ceil((db)(an-a1)/n);
        for(i=a1+1; i+down-1 < an; i += down)
        {
            MinMax(i,i+down-1,&l,&r);
            if(l != -1) ans = max(ans, l-last), last = r;
        }
        if(i < an)
        {
            MinMax(i,an-1,&l,&r);
            if(l != -1) ans = max(ans, l-last), last = r;
        }
        ans = max(ans, an - last);
        return ans;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值