제출 #531871

#제출 시각아이디문제언어결과실행 시간메모리
531871new_accSplit the sequence (APIO14_sequence)C++14
100 / 100
814 ms82012 KiB
#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef vector<ll> vi;
typedef vector<ll> vl;
const int N=1e5+10;
deque<int>deq;
ll dp[N],dp2[N];
int sp[N],t[N];
int bb[N][201];
ll wz(int j,int i){
	return dp[j]-(ll)sp[j]*(ll)sp[j]+(ll)sp[j]*(ll)sp[i];
}
long double prz(int x,int y){
	ll b1=dp[x]-(ll)sp[x]*(ll)sp[x];
	ll a1=sp[x];
	ll b2=dp[y]-(ll)sp[y]*(ll)sp[y];
	ll a2=sp[y];
	if(a1==a2) return 1e18;
	return (long double)(b2-b1)/(long double)(a1-a2);
}
void del(int i){
	while(deq.size()>1){
		int p=deq.front();
		deq.pop_front();
		int d=deq.front();
		if(wz(p,i)>wz(d,i)){
			deq.push_front(p);
			break;
		}
	}
}
void dod(int i){
	while(deq.size()>1){
		int p=deq.back();
		deq.pop_back();
		int d=deq.back();
		if(prz(p,i)==1e18){
			if(dp[p]-(ll)sp[p]*(ll)sp[p]>=dp[i]-(ll)sp[i]*(ll)sp[i]){
				deq.push_back(p);
				return;
			}
			continue;
		}else{
			if(prz(p,i)>prz(d,i)){
				deq.push_back(p);
				break;
			}
		}
	}
	deq.push_back(i);
}
void solve(){
	int n,k;
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>t[i];
		sp[i]=sp[i-1]+t[i];
	}
	deq.push_back(0);
	for(int j=1;j<=k;j++){
		for(int i=1;i<=n;i++){
			del(i);
			dp2[i]=wz(deq.front(),i);
			bb[i][j]=deq.front();
			dod(i);
		}
		for(int i=1;i<=n;i++) dp[i]=dp2[i];
		deq.clear();
	}
	cout<<dp[n]<<"\n";
	int curr=n;
	for(int i=k;i>=1;i--){
		curr=bb[curr][i];
		cout<<curr<<" ";
	}
	cout<<"\n";
}
int main(){
	solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...