zoukankan      html  css  js  c++  java
  • [APIO2016]Gap(交互)

    第一个subtask应该还是很送分的,就是每次询问两端值的大小,(N+1)/2次即可。

    考虑第二个subtask,首先还是先把最小值和最大值询问出来,然后发现不需要询问每一个数,直接将[l+1,r-1]均分成N-1个区间,因为最长区间长度一定不小于平均值,所以应该会跨越两段,若在某一段内有值即可直接统计答案,发现除了头尾其余的点各询问到3次。

    #include "gap.h"
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    const int maxN=1e5+7;
    ll a[maxN];
    ll findGap(int T,int N)
    {
        if(T==1)
        {
            int l=2,r=N-1;
            MinMax(0,1e18,a+1,a+N);
            while(l<=r)MinMax(a[l-1]+1,a[r+1]-1,a+l,a+r),l++,r--;
            ll ret=0;
            for(int i=2;i<=N;i++)ret=max(ret,a[i]-a[i-1]);
            return ret;
        }
        ll ret=0,mn,mx,len,cur,lst,r;
        MinMax(0,1e18,&mn,&mx);
        len=(mx-mn-1)/N+1,cur=mn+1,lst=mn,r=mx;
        while(cur<=r)
        {
            MinMax(cur,cur+len,&mn,&mx);
            if(mn!=-1)ret=max(ret,mn-lst),lst=mx;
            cur+=len+1;
        }
        return ret;
    }
    View Code
  • 相关阅读:
    如何理解联合文件系统?
    Docker 学习笔记(一)
    Bzoj 3124: [Sdoi2013]直径 题解
    Bzoj 3131 [Sdoi2013]淘金 题解
    欧拉路(题目)
    硬币问题
    线段树、树状数组
    Splay树、Treap树
    模拟退火
    广搜题目(一本通)
  • 原文地址:https://www.cnblogs.com/hfctf0210/p/10908485.html
Copyright © 2011-2022 走看看