Cod sursa(job #2812538)

Utilizator lolismekAlex Jerpelea lolismek Data 4 decembrie 2021 17:36:17
Problema Carnati Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <unordered_map>

#define time_buy first
#define price second
#define ll long long

using namespace std;

ifstream fin("carnati.in");
ofstream fout("carnati.out");

const int N = 2001;
ll sum[N];
pair <ll, ll> v[N];
unordered_map <ll, bool> tried_prices;

void reset_sum(ll n) {
	for (ll j = 0; j < n; j++) sum[j] = 0;
}

// DE CE IA 80P PORCARIA ASTA >:( ???

int main() {
	ll n, c;
	fin >> n >> c;
	for (ll i = 0; i < n; i++) fin >> v[i].time_buy >> v[i].price;
	sort(v, v + n);
	ll sum_fin = -1e9;
	for (ll i = 0; i < n; i++) {
		if (!tried_prices[v[i].price]) {
			ll val = v[i].price;
			tried_prices[v[i].price] = true;
			reset_sum(n);
			if (v[0].price >= val) sum[0] = val;
			else sum[0] = 0;
			for (ll j = 1; j < n; j++) {
				if (v[j].price >= val) sum[j] = val;
				sum[j] -= c * (v[j].time_buy - v[j - 1].time_buy);
			}
			ll curr_sum = 0, sum_max = -1e9, sum_min_prefix = 0, st, dr, sum_min_prefix_poz = -1;
			for (ll j = 0; j < n; j++) {
				curr_sum += sum[j];
				if (curr_sum - sum_min_prefix > sum_max) {
					sum_max = curr_sum - sum_min_prefix;
					st = sum_min_prefix_poz + 1;
					dr = j;
				}
				if (curr_sum < sum_min_prefix) {
					sum_min_prefix = curr_sum;
					sum_min_prefix_poz = j;
				}
			}
			while (sum[st] == 0 && st < n) st++;
			while (sum[dr] == 0 && dr > 0) dr--;
			ll sum_test = 0;
			for (ll j = st; j <= dr; j++) 
				if (v[j].price >= val) sum_test += val;
			sum_test -= c * (v[dr].time_buy - v[st].time_buy + 1);
			sum_fin = max(sum_fin, sum_test);
		}
	}
	fout << sum_fin;
	return 0;
}