제출 #768143

#제출 시각아이디문제언어결과실행 시간메모리
768143minhcoolCake 3 (JOI19_cake3)C++17
0 / 100
1 ms340 KiB
#define local
#ifndef local
#include ""
#endif
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
using namespace std;

#define int long long
#define fi first
#define se second
#define pb push_back
#define mp make_pair

typedef pair<int, int> ii;
typedef pair<ii, int> iii;
typedef pair<ii, ii> iiii;

const int N = 3e5 + 5;

const int oo = 1e18 + 7, mod = 1e9 + 7;

mt19937 rng(1);

int n, m, v[N], c[N];

int rnd(int l, int r){
	int temp = rng() % (r - l + 1);
	return abs(temp) + l;
}

ii dp[N][3];

ii maxi(ii a, ii b){
	if(a.fi != b.fi) return (a.fi > b.fi ? a : b);
	else return (a.se < b.se ? a : b);
}

ii cal(int ronaldo){
	for(int i = 0; i <= n; i++){
		for(int j = 0; j < 3; j++) dp[i][j] = {-oo, -oo};
	}
	dp[0][0] = {0, 0};
	for(int i = 1; i <= n; i++){
		dp[i][0] = {0, 0};
		dp[i][1] = maxi({dp[i - 1][0].fi + v[i] + 2 * c[i] - ronaldo, dp[i - 1][0].se + 1}, {dp[i - 1][1].fi + v[i] - ronaldo, dp[i - 1][1].se + 1});
		dp[i][1] = maxi(dp[i][1], dp[i - 1][1]);
		dp[i][2] = maxi({dp[i - 1][1].fi + v[i] - 2 * c[i] - ronaldo, dp[i - 1][1].se + 1}, dp[i - 1][2]);
	}
	return dp[n][2];
}

ii arr[N];

bool cmp(ii a, ii b){
	return a.se < b.se;
}

#ifdef local
void process(){
	cin >> n >> m;
	for(int i = 1; i <= n; i++) cin >> v[i] >> c[i];
	for(int i = 1; i <= n; i++) arr[i] = {v[i], c[i]};
	sort(arr + 1, arr + n + 1, cmp);
	for(int i = 1; i <= n; i++){
		v[i] = arr[i].fi;
		c[i] = arr[i].se;
	}
	int le = -2e12, ri = 2e12;
	int answer = -oo;
	while(le < ri - 2){
		int mid = (le + ri) >> 1;
		ii temp = cal(mid);
		if(temp.se >= m) le = mid;
		else ri = mid;
	//	cout << le << " " << ri << " " << temp.fi << " " << temp.se << "\n";
	//	if(temp.se <= m) answer = max(answer, temp.fi - m * temp.se);
	}
	for(int i = le; i <= ri; i++){
		ii temp = cal(i), temp2 = cal(i - 1);
	//	cout << i << " " << temp.fi << " " << temp.se << " " << temp2.fi << " " << temp2.se << "\n";
		if(temp.se <= m &&  temp2.se >= m) answer = max(answer, temp.fi + (temp.se) * i);
	}
	cout << answer << "\n";
}

signed main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	process();
}
#endif
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...