[BZOJ 4412] [Usaco2016 Feb]Circular Barn

[BZOJ 4412] [Usaco2016 Feb]Circular Barn_第1张图片

注意到“牛只能顺时针走“,所以贪心一定是对的。
把环复制成链,一遍扫找到最优位置,两遍扫算出答案。
没了

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
inline void read(int &x){x=0;char c;while((c=getchar())<'0'||c>'9');for(x=c-'0';(c=getchar())>='0'&&c<='9';x=x*10+c-'0');}
const int N = 100010 ;

int a[N + N], sum[N + N], n, pos = 1;

int main()
{
    read(n);
    for (int i = 1; i <= n; ++i) 
        read(a[i]), a[n + i] = a[i];

    for (int i = 1; i <= n + n; ++i)
    {
        if (i == pos + n) break;
        sum[i] = sum[i - 1] + a[i] - 1;
        while (sum[i] < sum[pos - 1]) pos++;
    }

    LL ans = 0; 
    int l = pos + n - 1, r = pos + n - 1;

    while (r >= pos)
    {
        while (!a[l]) l--;
        ans += (LL) (r - l) * (r - l);
        a[l]--, r--;
    }

    printf("%lld\n", ans);
    return 0;
}

你可能感兴趣的:(USACO,贪心,bzoj)