Cod sursa(job #2812525)

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

#define time_buy first
#define price second

using namespace std;

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

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

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

int main() {
	int n, c;
	fin >> n >> c;
	for (int i = 0; i < n; i++) fin >> v[i].time_buy >> v[i].price;
	sort(v, v + n);
	int sum_fin = -1e9;
	for (int i = 0; i < n; i++) {
		if (!tried_prices[v[i].price]) {
			int val = v[i].price;
			tried_prices[v[i].price] = true;

			reset_sum(n);

			if (v[0].price < val) sum[0] = 0;
			else sum[0] = val;

			if (v[0].price >= val) sum[0] = val;
			else sum[0] = 0;


			for (int 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);
			}

			// din suma aleasa, va trebui sa scadem c, deci ne putem preface pe timpul
			// dinamicii ca acel c nu exista

			int curr_sum = 0, sum_max = -1e9, sum_min_prefix = 0, st, dr, sum_min_prefix_poz = -1;
			for (int 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--;
			int sum_test = 0;
			for (int 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;
}