Pagini recente » Cod sursa (job #1276961) | Cod sursa (job #1963882) | Cod sursa (job #2969137) | Cod sursa (job #2590944) | Cod sursa (job #2812529)
#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;
}
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] = 0;
else sum[0] = val;
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);
}
// din suma aleasa, va trebui sa scadem c, deci ne putem preface pe timpul
// dinamicii ca acel c nu exista
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;
}