Submission #1336356

#TimeUsernameProblemLanguageResultExecution timeMemory
1336356semyaziFeast (NOI19_feast)C++20
41 / 100
1098 ms70076 KiB
#include <bits/stdc++.h>
using namespace std;

#define fox(i, n) for(int i = 0; i < (n); ++i)
#define rep(i, a, b) for(int i = a; i < (b); ++i)
#define rin(i, a, b) for(int i = (a); i <= (b); ++i)
#define rev(i, a, b) for(int i = (b); i >= (a); --i)
#define all(x) begin(x), end(x)
#define rall(x) rbegin(x), rend(x)
#define sz(x) (int)(x).size()
#define int long long
typedef long long ll;
typedef long double ld;
typedef string str;
typedef pair<int, int> ii;
typedef vector<int> vi;
typedef vector<ii> vii;
#define F first
#define S second
#define pb push_back
#define eb emplace_back
ll cdiv(ll a, ll b) { return a/b+((a^b)>0&&a%b); }
ll fdiv(ll a, ll b) { return a/b-((a^b)<0&&a%b); }
int MSB(int x) { return bit_width((unsigned long long)x)-1; }
int LSB(int x) { return countr_zero((unsigned long long)x); }
ii BS(int L, int H, function<int(int)>P) {
	while(abs(L-H)>1){
		int M=midpoint(L,H);
		if(P(M))H=M;
		else L=M;
	}
	return{L,H};
}
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int urand(int a, int b) { return uniform_int_distribution<int>(a, b)(rng); }
template<class T> bool ckmin(T& a, const T& b) {
    return b < a ? a = b, 1 : 0; }
template<class T> bool ckmax(T& a, const T& b) {
    return a < b ? a = b, 1 : 0; }
const int inf = 1e17;

void solve(){
	int n,k;cin>>n>>k;
	vi a(n+1);rin(i,1,n)cin>>a[i];
	rin(i,1,n)a.pb(0);
	n*=2;

	auto opt = [&](int l) -> ii {
		vector dp(n+1,vi(2)),cnt(n+1,vi(2));
		dp[1][0]=0;
		if(ckmax(dp[1][0],a[1]+l))cnt[1][0]=1;
		dp[1][1]=a[1];
		cnt[1][1]=0;
		rin(i,2,n){
			// CALC: dp[i][0]
			// case 1: don't include a[i]
			dp[i][0] = dp[i-1][0];
			cnt[i][0] = cnt[i-1][0];
			// case 2: include a[i] but something before too
			if(ckmax(dp[i][0], dp[i-1][1] + a[i] + l))
				cnt[i][0] = 1 + cnt[i-1][1];
			// case 3: include a[i] but nothing before
			if(ckmax(dp[i][0], dp[i-1][0] + a[i] + l))
				cnt[i][0] = 1 + cnt[i-1][0];

			// CALC: dp[i][1]
			dp[i][1] = a[i] + max(dp[i-1][0], dp[i-1][1]);
			if(dp[i-1][0] == dp[i-1][1])
				cnt[i][1] = min(cnt[i-1][0], cnt[i-1][1]);
			else if(dp[i-1][0] > dp[i-1][1])
				cnt[i][1] = cnt[i-1][0];
			else cnt[i][1] = cnt[i-1][1];
		}
		return {cnt[n][0],dp[n][0]};
	};

	int lo = -1e10; // cnt < k
	int hi = 1e10; // cnt >= k
	
	while((hi-lo)>1){
		int mid=midpoint(lo,hi);
		auto[cnt,val]=opt(mid);
		if(cnt < k)lo=mid;
		else hi=mid;
	}
	auto[cnt,val]=opt(hi);
	val -= cnt*hi; // counteract the thing
	//cout<<cnt<<' '<<val<<'\n';
	cout<<val<<'\n';
}

int32_t main() {
	cin.tie(0)->sync_with_stdio(0);
	cin.exceptions(cin.failbit);
	//cout<<solve()<<'\n';
	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...
#Verdict Execution timeMemoryGrader output
Fetching results...