[USACO 2017DEC] Haybale Feast

[题目链接]

          https://www.lydsy.com/JudgeOnline/problem.php?id=5142

[算法]

         首先用RMQ预处理S数组的最大值

         然后我们枚举右端点 , 通过二分求出合法的 , 最靠右的左端点 , 用这段区间的最大值更新答案 , 即可

         时间复杂度 : O(NlogN)

[代码]

        

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 1e5 + 10;
const int MAXLOG = 20;
const LL INF = 1e18;

int n;
LL m;
LL value[MAXN][MAXLOG];
LL F[MAXN] , S[MAXN];

template <typename T> inline void chkmax(T &x,T y) { x = max(x,y); }
template <typename T> inline void chkmin(T &x,T y) { x = min(x,y); }
template <typename T> inline void read(T &x)
{
    T f = 1; x = 0;
    char c = getchar();
    for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
    for (; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + c - '0';
    x *= f;
}
inline LL query(int l,int r)
{
        int k = (int)((double)log(r - l + 1) / log(2.0));
        return max(value[l][k] , value[r - (1 << k) + 1][k]); 
}

int main()
{
        
        read(n); read(m);
        for (int i = 1; i <= n; i++) 
        {
                read(F[i]);
                read(S[i]);
                value[i][0] = S[i];
        }
        for (int i = 1; i <= n; i++) F[i] += F[i - 1];
        for (int i = 1; i < MAXLOG; i++)
        {
                for (int j = 1; j + (1 << i) - 1 <= n; j++)
                {
                        value[j][i] = max(value[j][i - 1],value[j + (1 << (i - 1))][i - 1]);
                }
        }
        LL ans = INF;
        for (int i = 1; i <= n; i++) 
        {
                int l = 1 , r = i , pos = -1;
                while (l <= r)
                {
                        int mid = (l + r) >> 1;
                        if (F[i] - F[mid - 1] >= m)
                        {
                                pos = mid;
                                l = mid + 1;        
                        }    else r = mid - 1;
                }    
                if (pos == -1) continue;
                chkmin(ans,query(pos,i));
        }
        printf("%lld
",ans);
        
        return 0;
    
}
原文地址:https://www.cnblogs.com/evenbao/p/9794447.html