n個點,需要再一些點建立控制站,如果在第\(i\)個建站,貢獻為\(a[i]\)。假設前乙個站為\(j,則\([j+1, i]\)的點的貢獻是\(\sum_^ (i-k) b[k]\)。同時要求第\(n\)個點建站。求最小貢獻。(\(n \le 10^6\))
設\(d(i)\)表示前\(i\)個且在第\(i\)個牧場建控制站的最小貢獻
則\[d(i) = min( d(j) + cost(j+1, i) ) + a[i]
\]則\(ans = d(n)\)
設\(cost(i, j)\)表示\([i, j]\)由\(j\)控制的費用
$$\begin
cost(i, j) & = \sum_^ (j-k)b[k] \\
& = j \sum_^ b[k] - \sum_^ kb[k] \\
\end$$令
\(s_0(n) = \sum_^ b[i]\)
\(s_1(n) = \sum_^ ib[i]\)
則\[cost(i, j) = j (s_0(j) - s_0(i-1)) - (s_1(j) - s_1(i-1))\]則
$$\begin
d(i) & = min( d(j) + i(s_0(i) - s_0(j)) - s_1(i) + s_1(j) ) \\
& = min( d(j) + s_1(j) - is_0(j) ) + is_0(i) - s_1(i) + a[i] \\
\end
$$設決策\(j\)比\(k\)優且\(s_0(j) \le s_0(k)\)
$$\begin
d(j) + s_1(j) - i s_0(j) & \le d(k) + s_1(k) - i s_0(k) \\
d(j) + s_1(j) - ( d(k) + s_1(k) ) & \le i (s_0(j) - s_0(k)) \\
\frac & \ge i \\
\end
$$由於\(i\)遞增,\(s_0(i)\)隨\(i\)遞增而遞增,因此我們用單調佇列優化
#include using namespace std;
const int n=1000005;
typedef long long ll;
int a[n], q[n];
ll s0[n], s1[n], d[n];
inline ll y(int j, int k)
inline ll x(int j, int k)
int main()
for(int i=1; i<=n; ++i)
int fr=0, ta=1;
q[0]=0;
for(int i=1; i<=n; ++i)
int j=q[fr];
d[i]=d[j]+s1[j]-s0[j]*i+s0[i]*i-s1[i]+a[i];
while(ta-fr>=2 && y(q[ta-2], i)*x(q[ta-2], q[ta-1])<=y(q[ta-2], q[ta-1])*x(q[ta-2], i))
q[ta++]=i;
} printf("%lld\n", d[n]);
return 0;
}
bzoj 3437 小P的牧場
方程不難寫出fi max j 0 i 其中w j i 表示前 i 個牧場中,在 i處建立最後乙個檢查站,在 j 處建立倒數第二個檢查站的最小化費 這裡的w可以用兩個字首和求出,s1 i b i s2 i 1 a i 1 2 a i 2 3 a i 3 i 1 a 1 那麼w l,r s2 r s 2...
bzoj3437 小P的牧場
description 小p在mc裡有n個牧場,自西向東呈一字形排列 自西向東用1 n編號 於是他就煩惱了 為了控制這n個牧場,他需要在某些牧場上面建立控制站,每個牧場上只能建立乙個控制站,每個控制站控制的牧場是它所在的牧場一直到它西邊第乙個控制站的所有牧場 它西邊第乙個控制站所在的牧場不被控制 如...
BZOJ3437 小p的牧場
小p 在mc 裡有n 個牧場,自西向東呈一字形排列 自西向東用1 n 編號 於是他就煩惱了 為了控制這n 個牧場,他需要在某些牧場上面建立控制站,每個牧場上只能建立乙個控制站,每個控制站控制的牧場是它所在的牧場一直到它西邊第乙個控制站的所有牧場 它西邊第乙個控制站所在的牧場不被控制 如果它西邊不存在...