• [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;
        
    }
  • 相关阅读:
    vue的选项
    css(3)基础知识查漏补缺
    总结获取网页相关的一些宽高
    vue的全局api(二)
    vue的全局api
    vue的内部指令
    Java File
    Java File IO学习笔记
    systemctl介绍
    java学习笔记一(20180319)
  • 原文地址:https://www.cnblogs.com/evenbao/p/9794447.html
Copyright © 2020-2023  润新知