Submission #1340794

#TimeUsernameProblemLanguageResultExecution timeMemory
1340794icycheeesFeast (NOI19_feast)C++20
100 / 100
399 ms14520 KiB
//https://oj.uz/problem/view/NOI19_feast
#include<bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
using namespace std;
#define ll long long
#define endl '\n'
int n,k,rec[300005][2];
ll a[300005];
long double dp[300005][2];
bool check(long double x){
	for(int i=0;i<=n;i++)
		for(int j=0;j<2;j++)
			dp[i][j]=-1000000000000000000;
	dp[0][0]=0;
	for(int i=1;i<=n;i++){
		if(dp[i-1][0]-x==dp[i-1][1])
			dp[i][1]=dp[i-1][1],rec[i][1]=max(rec[i-1][0]+1,rec[i-1][1]);
		else if(dp[i-1][0]-x>dp[i-1][1])
			dp[i][1]=dp[i-1][0]-x,rec[i][1]=rec[i-1][0]+1;
		else dp[i][1]=dp[i-1][1],rec[i][1]=rec[i-1][1];
		dp[i][1]+=a[i];
		if(dp[i-1][0]==dp[i-1][1])
			dp[i][0]=dp[i-1][0],rec[i][0]=max(rec[i-1][0],rec[i-1][1]);
		else if(dp[i-1][0]>dp[i-1][1])
			dp[i][0]=dp[i-1][0],rec[i][0]=rec[i-1][0];
		else dp[i][0]=dp[i-1][1],rec[i][0]=rec[i-1][1];
	}
	if(dp[n][0]>dp[n][1]) return rec[n][0]>=k;
	else if(dp[n][0]<dp[n][1]) return rec[n][1]>=k;
	else return max(rec[n][0],rec[n][1])>=k;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n>>k;
	__int128 suma=0;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		if(a[i]>0) suma+=a[i];
	}
	__int128 l=0,r=suma*1000000000,mid;
	while(l<=r){
		mid=(l+r)/2;
		if(check(1.0*mid/1000000000)) l=mid+1;
		else r=mid-1;
	}
	long double lambda=1.0*r/1000000000;
	check(lambda);
	cout<<(long long)round(lambda*k+max(dp[n][0],dp[n][1]))<<endl;
	return 0;
}
#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...