bzoj4518征途 斜率優化

2022-09-01 06:21:11 字數 1468 閱讀 5257

我們可以從題目中的方差來想,也就很容易的到這個式子

\[ans=m^2*\frac^})^2}}

\]化簡就會得到

\[ans=m*\sum_^})^2}

\]在化簡得

\[ans=^^2}+^}

\]經過觀察,我們可以很容易發現\(\sum_^\)是定值,同時\(m*\sum_^^2\)中的\(m\)也是定值,所以我們的目標就是讓\(\sum_^^2}\)最小

我們令\(dp[i][j]=\min\\)

其中我們令\(sum[i]=\sum_^\)

其中\(val_k\)是第k段路的長度

由此我們就可得到乙個開o2可以卡成80的**

#include#include#include#includeusing namespace std;

long long n,m,dp[3001][3001],sum[3001];

const int buffersize=100*1000;

char buffer[buffersize],*head,*tail;

bool not_eof=true;

inline char getchar()

return not_eof?*head++:-1;

}inline long long rd()

inline void scan(char *str)

int main()

dp[0][0]=-sum[n]*sum[n];

for(int i=0;i但是我們可以發現這個**是\(o(nm)\)的,顯然我是不可以接受的。其實我們可以很容易證明這個的決策單調性,於是我們就可以用斜率優化

我們令\(y

因為決策單調性,所以對於決策\(i\)時,k轉移必定比j轉移要優,我們就可以得到這麼乙個式子

\[dp[i-1][x]+(sum[j]-sum[x])^2

化簡得\[\frac<2*sum[j]

\]這樣我們就可以用斜率又花了

我們把\(p_1(dp[i-1][x]+sum[x]^2,sum[x])\)和\(p_2(dp[i-1][y]+sum[y]^2,sum[y])\)看做\(p_1,p_2\)兩個點,剛剛那個式子也就是它們所連線的斜率表示式

我們也就可以得到這樣的**

#include#include#includeusing namespace std;

long long n,m,dp[3001][3001],sum[3001];

int q[3001];

double getpoint(int i,int p)

double slope(int j,int k,int p)

int main()

for(int k=2;k<=m;k++)

} printf("%lld",m*dp[n][m]-sum[n]*sum[n]);

return 0;

}

bzoj4578 斜率優化

方法麻煩了,簡單方法見 include include include include include includeusing namespace std typedef long long ll const ll inf 1e15 ll dp 3005 3005 sum 3005 int n,m...

斜率優化bzoj 1597

看到題目,時間複雜度至少是o n logn o nlogn o nlog n 或o n sqrt n o nsqrt n o nsqr t n 前者的概率較大,此題有計算內乘積,應該與分塊無關 早就知道是斜率優化 假設長為a aa值,寬為bbb值 觀察題目,可以猜想一下決策會不會有連續性,猜想決策可...

bzoj 1911斜率優化

這個題為什麼有個 關於斜率優化又有了新的感悟 對於次優解的排除 假設對於i來說l是次優解。即滿足k q l q l 1 k i 時,l 1比l更優 k q l q l 1 表示這兩個點連成一條線的斜率,k i 表示在i處那根線的斜率,這個很容易就可以證明 對於提前排除不可能的解 假設r是考慮排除的點...