link
題目大意:給定序列,將它劃分為\(m\)段使得方差最小,輸出\(s^2*m^2\)(乙個整數)。
\(\text\)
這題我通過題解中的大佬部落格學到了一般化方差柿子的寫法。
下面來推柿子:
\[s^2=\frac^n (x_i-\overline)^2}=\frac(\sum_^n x_i^2+n*(\frac^n x_i})^2-2\sum_^n (x_i* \frac^n x_k}))
\]\[s^2=\frac^n x_i^2+\frac^n x_i)^2}-2 \frac^n x_i)^2}}
\]化簡得到:
\[s^2=\frac^n x_i)^2}}
\]兩邊乘以\(n^2\)得到:
\[s^2n^2=n\sum_^n x_i^2 -(\sum_^n x_i)^2=n\sum_^n x_i^2 -sum[n]^2
\]其中\(sum\)是字首和。最後這個柿子裡面,\(n,sum\)都是常數,最終要處理的就是\(\sum_^n x_i^2\).
設\(dp[i][l]\)表示前\(i\)個元素劃分\(l\)次的最小平方和,有:
\[dp[i][l]=\min_\)的時候最好用\(\text\).順序不要搞反。當然這個題主要難點是推方差柿子……\(\text\)
附上推柿子時\(\text\)上的東西:#includeusing namespace std;
#define int long long
int n,m,a[20010],sum[20010];
int dp[4000][4000],tail,head;
int q[200010];
int x(int x)
int y(int x,int p)
long double slope(int x,int y,int p)
//dp[i][l]=dp[j][l-1]+(sum[i]-sum[j])^2
signed main()
} printf("%lld\n",m*dp[n][m]-sum[n]*sum[n]);
return 0;
}
\(dp[i][l]=dp[j][l-1]+(sum[i]-sum[j])^2\)
\(dp[i]][l]=dp[j][l-1]+sum[i]^2+sum[j]^2-2sum[i]sum[j]\)
\(dp[j][l-1]+sum[j]^2=2sum[i]sum[j]+dp[i][l]-sum[i]^2\)
\(y=dp[j][l-1]+sum[j]^2,k=2sum[i],x=sum[j],b=dp[i][l]-sum[i]^2\)
最小化\(b\),即可
\(ans=-sum[n]^2+m*dp[n][m]\)
SDOI2016 遊戲題解
這道題太噁心了,調了我整整一晚上,結果發現是乙個bi 錯誤,多多捂臉 這道題比之前的題多了乙個初始化和區間查詢的操作,主要是區間查詢噁心 因為要區間查詢,所以必須維護區間最低點,修改和查詢操作被改得面目全非。我們要維護的話,必須從現值,子值,新值,具體的不好多說 看 吧 include define...
筆記篇 斜率優化dp(二) SDOI2016征途
傳 送 門 搜題目名會搜出很多奇怪的東西.這個題目似乎有點毒?比如在bzoj和loj上可以1a的 上會在luogu tle 2個點,在cogs tle 10個點 但是根據已有的資料來看資料都是一樣的.毒瘤評測姬毀我oi 這個題的狀態轉移方程並不是很好推的說.出題人讓 m 2 肯定是有目的的啊.比如不...
SDOI2016 數字配對
傳送門 裸費用流。建邊 對於a i a j pr ime a j a i frac prime a j a i a j a i prim e a j a i 需要i ii向j n j nj n連,並且j jj向i n i ni n連。費用即為c i c j c i c j c i c j 流量無窮大...