方程不難寫出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[l]
−(r−
l)∗s
1[l]
這樣求w是o(
1)的 所以總遞推是o(
n2) 的,不能滿足要求
輸出決策:
根據wyw第一定律,我們玄學地認為,這個遞推滿足決策單調性
輸出決策後發現他們總是挨得很近,所以抱著試一試的心理,我們加入不穩定的優化,玄學演算法:即記錄當前決策,下次直接從上乙個決策往後找。
接下來是穩定的演算法:
二分演算法維護乙個棧,存乙個決策的範圍,然後每次加入新決策就二分尋找斷點,時間複雜度o(
nlog
2n)
fi=f
j+s2
[i]−
s2[j
]−(i
−j)×
s1[j
] 化簡整理 fi
=(fj
+j×s
1[j]
−s2[
j])−
i×s1
[j]+
s2[i
] 令y
j=fj
+j×s
1[j]
−s2[
j] ,x
j=s1
[j]
那麼 fi=
yi−i
×xj+
s2[i
] 斜率為i,是單調遞增的,維護下凸殼。時間複雜度o(
看來玄學最快,斜率優化第二,再次是二分
其實所謂的玄學演算法應該是可以證明的吧,直覺告訴我,控制的代價隨著距離的增加會逐漸增加,所以我們應該盡量讓它控制的牧場少一些。。。有大牛會證嗎?
//決策單調性+玄學
#include
#include
#include
#define maxn 1000010
#define inf ((long long)1<<60)
#define ll long long
using
namespace
std;
ll a[maxn], b[maxn], s1[maxn], s2[maxn], n, f[maxn], c[maxn];
struct intervalit[maxn];
void init()
ll w(ll l, ll r)
void work()
//決策單調性+二分
#include
#include
#include
#define maxn 1000010
#define inf ((long long)1<<60)
#define ll long long
using
namespace
std;
ll a[maxn], b[maxn], s1[maxn], s2[maxn], n, f[maxn], top;
struct intervals[maxn];
void init()
ll w(ll l, ll r)
void work()
; for(i=1;i<=n;i++)
if(update(i,r) < update(s[top].c,r))s[top].r=r-1;
if(s[top].r1]=(interval),top++;
}}int main()
//斜率優化
#include
#include
#define inf ((long long)1<<60)
#define ll long long
#define maxn 1000010
using namespace std;
ll a[maxn], b[maxn], s1[maxn], s2[maxn], n, f[maxn];
struct pointq[maxn];
void init()
void work()
; for(i=1;i<=n;i++)
,r++;
}}int main()
bzoj3437 小P的牧場
description 小p在mc裡有n個牧場,自西向東呈一字形排列 自西向東用1 n編號 於是他就煩惱了 為了控制這n個牧場,他需要在某些牧場上面建立控制站,每個牧場上只能建立乙個控制站,每個控制站控制的牧場是它所在的牧場一直到它西邊第乙個控制站的所有牧場 它西邊第乙個控制站所在的牧場不被控制 如...
BZOJ3437 小p的牧場
小p 在mc 裡有n 個牧場,自西向東呈一字形排列 自西向東用1 n 編號 於是他就煩惱了 為了控制這n 個牧場,他需要在某些牧場上面建立控制站,每個牧場上只能建立乙個控制站,每個控制站控制的牧場是它所在的牧場一直到它西邊第乙個控制站的所有牧場 它西邊第乙個控制站所在的牧場不被控制 如果它西邊不存在...
bzoj3437 小p的牧場
題幹 略。暴力做法 o n 2 強行無腦dp。整解 s1為一維字首和,s2為二維字首和 存 b i i f i min f j i s1 i s1 j s2 i s2 j 若 j 優於 k 則有 f j s2 j f k s2 k s1 j s1 k i 然後想起來 y x k 發現這道題是一道斜率...