제출 #1228777

#제출 시각아이디문제언어결과실행 시간메모리
1228777PlayVoltzFeast (NOI19_feast)C++20
100 / 100
120 ms9812 KiB
#include <iostream>
#include <map>
#include <vector>
#include <climits>
#include <stack>
#include <string>
#include <queue>
#include <algorithm>
#include <set>
#include <unordered_set>
#include <iostream>
#include <unordered_map>
#include <cmath>
#include <cctype>
#include <bitset>
#include <iomanip>
#include <cstring>
using namespace std;

#define int long long
#define pii pair<int, int>
#define mp make_pair

int n;
vector<int> vect, psum;
vector<pii> dp;

pii pmax(pii a, pii b){
	if (a.first==b.first)return a.second<b.second?a:b;
	return a.first>b.first?a:b;
}

pii feast(int pen){
	dp[0]=mp(0, 0);
	pii best=mp(0, 0);
	for (int i=1; i<=n; ++i){
		dp[i]=pmax(dp[i-1], mp(best.first+psum[i]-pen, best.second+1));
		best=pmax(best, mp(dp[i].first-psum[i], dp[i].second));
	}
	return dp[n];
}

int32_t main(){
	int k;
	cin>>n>>k;
	vect.resize(n+1);
	dp.resize(n+1);
	psum.resize(n+1, 0);
	for (int i=1; i<=n; ++i)cin>>vect[i], psum[i]=psum[i-1]+vect[i];
	int low=-1, high=LLONG_MAX/100000;
	while (low+1<high){
		int mid = (low+high)/2;
		if (feast(mid).second>=k)low=mid;
		else high=mid;
	}
	pii res=feast(low);
	cout<<res.first+res.second*low;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...