bzoj 4412: [Usaco2016 Feb]Circular Barn

4412: [Usaco2016 Feb]Circular Barn

Description

有一个N个点的环,相邻两个点距离是1。点顺时针标号为1..N。
每一个点有ci头牛,保证∑ci=N。
每头牛都可以顺时针走。设一头牛走了d个单位停下了,将耗费d^2的能量。
请设计一种牛的走法,使得每一个点上都正好有一头牛,且最小化耗费的能量。

Input

第一行一个数N。N <= 100000
接下来N行,每行一个数ci。

Output

输出一个数表示耗费能量的最小值

Sample Input

10
1
0
0
2
0
0
1
2
2
2

Sample Output

33

题解:

所有奶牛只能往顺时针方向走,所以应该存在一个起点。

那么怎么找这个起点呢??

先把所有权值-1,然后我们考虑这样一个问题,若从x->y之间所有的奶牛都不会走出这个范围当且仅当不存在一个k,使得k->y权值为正,这个脑补一下吧。。。

那么这个起点就是这个环的最大子串和的起点,证明不讲了,然后就把环变成一条链,终点就是起点前一个。

最后是求最小值,这个也是有难度的。

由于(x+y)2>x2+y2

所以到某个点肯定会在中途换班,具体实现用个队列就好了。

#include<stdio.h>
#include<iostream>
using namespace std;
const int N=100005;
int n,i,s,l,x,t,w,a[N],g[N];
long long ans;
int main()
{
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        a[n+i]=a[i];
    }
    ans=0;x=1;
    for(i=1;i<=2*n-1;i++)
    {
        if(s<0) s=0,x=i;
        s+=a[i]-1;
        if(s>ans)
        {
            ans=s;
            l=x;
        }
    }
    t=1;w=0;ans=0;
    for(i=l;i<=l+n-1;i++)
    {
        while(a[i]--) g[++w]=i;
        ans+=1LL*(i-g[t])*(i-g[t]);
        t++;
    }
    cout<<ans;
    return 0;
}
时间: 2024-08-04 03:58:02

bzoj 4412: [Usaco2016 Feb]Circular Barn的相关文章

【bzoj4412】[Usaco2016 Feb]Circular Barn

先看成一条链 for一遍找位置 在for一遍算答案 #include<algorithm>#include<iostream>#include<cstring>#include<string>#include<cstdio>#include<cmath>using namespace std; typedef long long LL; #define N 100010 int n;int cnt=1; int a[N<<

BZOJ 4576: [Usaco2016 Open]262144

Description 一个序列,每次可以将两个相同的数合成一个数,价值+1,求最后最大价值 \(n \leqslant 262144\) Sol DP. 这道题是 BZOJ 4580: [Usaco2016 Open]248 加强版. 做248的那个区间DP其实很多方案都是0,而且一个区间中只有一个合法的数字. 然后就是 一个区间合成一个数的方案的这个数字是固定的. \(f[i][j]\) 表示以 \(i\) 结尾是否能合成 \(j\),同时记录一下转移位置,每次向前找前一个指针就可以了. 复

Bzoj 1696: [Usaco2007 Feb]Building A New Barn新牛舍 中位数,数学

1696: [Usaco2007 Feb]Building A New Barn新牛舍 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 394  Solved: 181[Submit][Status][Discuss] Description 经过多年的积蓄,农夫JOHN决定造一个新的牛舍.他知道所有N(2 <= N <= 10,000)头牛的吃草位置,所以他想把牛舍造在最方便的地方. 每一头牛吃草的位置是一个整数点(X_i, Y_i) (-10,0

BZOJ 1696 [Usaco2007 Feb]Building A New Barn新牛舍 数学

题意:链接 方法:数学+模拟 解析: 首先这类问题不是第一次见了,所以直接知道拿x的中位数.y的中位数. 这题就是讨论情况很的烦. 题中有个限制,给出待求和的点不能选取. 所以假设奇数个点,求出x中位数,y中位数. 检验x,y是否存在待求和的点集里,如存在则推断四种情况. 推断的四种情况各自是(x-1,y),(x+1,y),(x,y-1),(x,y+1),次优解一定存在于这四种情况中,这个应该很好理解? 假设不存在于原点集中.则直接求和. 假设偶数个点,则讨论全部x可取值以及y可取值就可以,建议

BZOJ 1734: [Usaco2005 feb]Aggressive cows 愤怒的牛( 二分答案 )

最小最大...又是经典的二分答案做法.. -------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define rep( i , n ) for( int i = 0 ; i < n ; ++i ) #defin

BZOJ 3942: [Usaco2015 Feb]Censoring

3942: [Usaco2015 Feb]Censoring Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 404  Solved: 221[Submit][Status][Discuss] Description Farmer John has purchased a subscription to Good Hooveskeeping magazine for his cows, so they have plenty of material

bzoj 1734: [Usaco2005 feb]Aggressive cows 愤怒的牛

1734: [Usaco2005 feb]Aggressive cows 愤怒的牛 Description Farmer John has built a new long barn, with N (2 <= N <= 100,000) stalls. The stalls are located along a straight line at positions x1,...,xN (0 <= xi <= 1,000,000,000). His C (2 <= C &l

BZOJ 1651: [Usaco2006 Feb]Stall Reservations 专用牛棚( 线段树 )

线段树.. -------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define rep( i , n ) for( int i = 0 ; i < n ; i++ ) #define c

BZOJ 1651: [Usaco2006 Feb]Stall Reservations 专用牛棚

题目 1651: [Usaco2006 Feb]Stall Reservations 专用牛棚 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 553  Solved: 307[Submit][Status] Description Oh those picky N (1 <= N <= 50,000) cows! They are so picky that each one will only be milked over some preci