Submission #1175899

#TimeUsernameProblemLanguageResultExecution timeMemory
1175899VicBVicFeast (NOI19_feast)C++20
100 / 100
126 ms9832 KiB
#include <bits/stdc++.h>
using namespace std;
//#define TESTS

#define x first
#define y second
#define pii pair<int,int>
#define veci vector<int>
#define vecp vector<pii>
#define all(x) x.begin(), x.end()
#define pb(x,y) x.push_back(y)

#define int long long

const int maxn = 3e5+5;
const int maxb = 40;

int n,k, v[maxn];
//costul daca termini la i
int d[maxn], mxd[maxn], arrd[maxn];

bool good(int l)
{
	for(int i=0;i<n;i++)
	{
		d[i]=v[i]-l;
		mxd[i]=0;
		arrd[i]=1;
	}

	for(int i=1;i<n;i++)
	{
		if(d[i]<=d[i-1]+v[i])
		{
			d[i]=d[i-1]+v[i];
			arrd[i]=arrd[i-1];
		}

		if(d[i]<=d[mxd[i-1]]+v[i]-l)
		{
			d[i]=d[mxd[i-1]]+v[i]-l;
			arrd[i]=arrd[mxd[i-1]]+1;
		}

		mxd[i]=(d[i]>d[mxd[i-1]]) ? i : mxd[i-1];
	}

	return arrd[mxd[n-1]] >=k;
}

void solve()
{
	cin>>n>>k;
	for(int i=0;i<n;i++) cin>>v[i];

	int l=0;
	for(int b=(1ll<<maxb); b>0; b>>=1)
	{
		if(good(l+b)) l+=b;
	}

	good(l);

	cout<<d[mxd[n-1]]+l*arrd[mxd[n-1]]<<'\n';
}

int32_t main()
{
	cin.tie(0);
	cout.tie(0);
	ios::sync_with_stdio(0);

	int t=1;

	#ifdef TESTS
		cin>>t;
	#endif
	while(t--)
	{
		solve();
	}
	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...