1. 程式人生 > >BZOJ4518 [Sdoi2016]征途

BZOJ4518 [Sdoi2016]征途

裸斜率優化

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<iomanip>
#include<cstring>
#include<cmath>
#include<ctime>
#include<vector>
#include<stack>
#include<queue>
#include<set>
#include<bitset>
#include<map>
using namespace std;
#define MAXN 3010
#define MAXM 10010
#define INF 1000000000
#define MOD 1000000007
#define ll long long
#define eps 1e-8
ll f[MAXN][MAXN];
ll a[MAXN];
ll s[MAXN];
int q[MAXN][MAXN];
int hd[MAXN],tl[MAXN];
int n,m;
double xl(int x,int y,int z){
	z--;
	return 1.0*(f[x][z]-f[y][z]+s[x]*s[x]-s[y]*s[y])/(s[x]-s[y]);
}
int main(){
	int i,j,k;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	int tot=0;
	for(i=1;i<=n;i++){
		if(a[i]!=0){
			a[++tot]=a[i];
		}
		s[i]=s[i-1]+a[i];
	}
	n=tot;
	q[1][++tl[1]]=0;
	for(i=1;i<=n;i++){
		for(j=1;j<=min(m,i);j++){
			while(hd[j]<tl[j]&&xl(q[j][hd[j]+1],q[j][hd[j]],j)<2*s[i]){
				hd[j]++;
			}
			k=q[j][hd[j]];
			f[i][j]=f[k][j-1]+(s[i]-s[k])*(s[i]-s[k]);
			if(j==m){
				continue ;
			}
			while(hd[j+1]<tl[j+1]&&xl(q[j+1][tl[j+1]-1],q[j+1][tl[j+1]],j+1)>xl(q[j+1][tl[j+1]],i,j+1)){
				tl[j+1]--;
			}
			q[j+1][++tl[j+1]]=i;
		}
	}
	printf("%lld\n",f[n][m]*m-s[n]*s[n]);
	return 0;
}

/*
10 3
1 2 3 4 5 6 7 8 9 10
*/

相關推薦

bzoj4518: [Sdoi2016]征途(DP+決策單調性分治優化)

clas code -1 long long lib fine bsp char click   題目要求...   化簡得...   顯然m和sum^2是已知的,那麽只要讓sigma(si^2)最小,那就變成了求最小平方和的最小值,經典的決策單調性,用分治優

bzoj4518: [Sdoi2016]征途

化簡 class freopen print log style long 征途 ont 第一眼看到這題的想法:這不就是一題傻逼DP嗎。。。水經驗 然而……誒誒誒DP怎麽寫 %了題解(還被嘲諷%題解比自己AC還多)原來是式子化簡錯了(囧orz

bzoj4518[Sdoi2016]征途 斜率優化dp

必須 out 兩個 sam gen -- double http pos 4518: [Sdoi2016]征途 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1657 Solved: 915[Submit][Stat

[BZOJ4518][Sdoi2016]征途(斜率優化dp)

題目描述 傳送門 題解 題目讓求v∗m2別有用心啊 令ai表示每天走的路程和,si表示前i段路程的字首和 ans=m2∗1m[∑i=1m(ai−snm)2] =m(∑i=1ma2i+s2

BZOJ4518 [Sdoi2016]征途

裸斜率優化#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm&g

bzoj4518 [Sdoi2016]征途(斜率優化dp)

分析: 斜率優化dp 很多人做斜率優化的時候喜歡畫出斜率 我偏向畫柿子 題目就是把若干個元素分成m份, 每一份的價值是該組中的元素之和 使得m組數的方差最小 平均數:x=(sum[1]+sum[2]+..+sum[m])/m //sum是

[luogu4072][bzoj4518][SDOI2016]征途

line 斜率 amp %d bits can long ems spa 題目分析 Pine開始了從S地到T地的征途。 從S地到T地的路可以劃分成n段,相鄰兩段路的分界點設有休息站。 Pine計劃用m天到達T地。除第m天外,每一天晚上Pine都必須在休息站過夜。所以,一段路

bzoj4518】[Sdoi2016]征途 斜率優化dp

end 時間復雜度 leg size cpp print ++ 需要 () 原文地址:http://www.cnblogs.com/GXZlegend/p/6812435.html 題目描述 Pine開始了從S地到T地的征途。 從S地到T地的路可以劃分成n段,相鄰兩段路的

BZOJ4518】[Sdoi2016]征途 斜率優化

輸出 博客 征途 get memset targe 兩個 scan 詳細 【BZOJ4518】[Sdoi2016]征途 Description Pine開始了從S地到T地的征途。 從S地到T地的路可以劃分成n段,相鄰兩段路的分界點設有休息站。 Pine計劃用m天

●BZOJ 4518 [Sdoi2016]征途

times iostream min problem return scanf 斜率優化dp body nbsp 題鏈: http://www.lydsy.com/JudgeOnline/problem.php?id=4518 題解: 斜率優化DP 首先看看最後答案

【筆記篇】斜率優化dp(二) SDOI2016征途

不能 最小化 征途 這樣的 string cpp mar logs -s =======傳=送=門======= 搜題目名會搜出很多奇怪的東西... 這個題目似乎有點毒? 比如在bzoj和loj上可以1A的代碼上會在luogu TLE 2個點, 在cogs TLE 10個

[SDOI2016]征途

show 前綴和 表示 lin .com 前綴 pre ans fin [SDOI2016]征途 題目 思路 這題目很繞(其實也還好)。 首先讓我們看看要求的到底是什麽。 \[ans=m^2\times s^2(s^2為方差)\] 定義\(v\)為每一段的平均數,\(b_i

【題解】SDOI2016征途

ble efi getc code pri color AI define swap   就放個代碼吧……實在是太套路了。不過據說有復雜度還要低很多的算法,不知道是怎麽做呀…… #include <bits/stdc++.h> using namespace

斜率優化實現初步(7) [BZOJ][4518][Sdoi2016]征途

sdi 斜率優化 ons style efi its space pre print #include<bits/stdc++.h> using namespace std; //#define int long long const int

洛谷P4072 [SDOI2016]征途(斜率優化)

傳送門 tps double nbsp ble esp 就是 int turn 傳送門 推式子(快哭了……)$$s^2*m^2=\sum _{i=1}^m (x_i-\bar{x})^2$$ $$s^2*m^2=m*\sum _{i=1

bzoj 4518 [Sdoi2016]征途 (斜率優化DP)

nbsp lld tchar || algo 奇怪 freopen namespace urn 我犯了sb錯誤然後調了1個小時......隊列寫錯了 斜率k遞增,b取最小值,隊列維護凸包即可 f[0]的預處理好像有些奇怪???我把inf調大就過了??? 1 #inclu

洛谷4072 SDOI2016征途 (斜率優化+dp)

首先根據題目中給的要求,推一下方差的柿子。 \[v\times m^2 = m\times \sum x^2 - 2 \times sum \times sum +sum*sum\] 所以\(ans = v*m^2 = m\times \sum x^2 - sum*sum\) 那我們實際上就是最大化平方

luoguP4072 [SDOI2016]征途

[SDOI2016]征途 大體 大概就是推推公式,發現很傻逼的\(n^3\)DP get60 進一步我們發現狀態不能入手,考慮優化轉移 套個斜率優化板子 每一層轉移來一次斜率優化 思路 先便便式子 \[s^2=m^{2}*\frac{\sum_{1}^{m}(a_{i}-\overline{a})^2

bzoj 4518: [Sdoi2016]征途

題意:把n段路分成m天走,求每天走的路程的方差的最小值。輸出方差*m^2。 題解:斜率優化 我們先推一推公式。v×m2=∑mi=1(xi−x¯)2m×m2=∑i=1m(x2i−2xix¯+x¯2)×

4518: [Sdoi2016]征途|斜率優化

裸的斜率優化。。我考場上SB寫暴力 #include<algorithm> #include<iostream> #include<complex> #includ