Cod sursa(job #144024)

Utilizator azotlichidAdrian Vladu azotlichid Data 27 februarie 2008 02:26:17
Problema Carnati Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <algorithm>
#include <iostream>
#include <iterator>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <string>
#include <vector>
#include <cassert>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cctype>
#include <cstring>
using namespace std;

#define ALL(x) (x).begin(), (x).end()
#define CLEAR(X) (memset(X, 0, sizeof(X)))
#define FORI(it, x) for (__typeof((x).begin()) it = (x).begin(); it != (x).end(); ++it)
#define FOR(i, N, M) for (int i = (int)(N); i <= (int)(M); ++i)
#define REP(i, N) for (int i = 0; i < (int)(N); ++i)
#define SIZE(X) (int)((X).size())
#define TIPA(a, i) (cerr << #a << "[" #i " = " << (i) << "] = " << (a)[i] << endl)
#define TIP(x) (cerr << #x << " = " << (x) << endl)

#define MP make_pair
#define PB push_back
#define INF 0x3F3F3F3F
typedef long long LL;

#define TMAX 1505
vector<pair<int, int> > buyer;
int nr[TMAX], m[TMAX];
int N, C, x, y, Ans = 0;

int main(void)
{
    freopen("carnati.in", "r", stdin);
    freopen("carnati.out", "w", stdout);

	scanf("%d %d", &N, &C);
	REP(i, N) scanf("%d %d", &x, &y), buyer.PB(MP(y, x));

	REP(i, N) {
		int price = buyer[i].first;
		CLEAR(nr);
		REP(j, N) if (buyer[j].first >= price)
			++nr[buyer[j].second];

		int mn = 0;
		FOR(j, 0, TMAX-1) {
			m[j] = (j > 0 ? m[j-1] : 0) + nr[j]*price - C;
			if (Ans < m[j] - mn) Ans = m[j] - mn;
			if (mn > m[j]) mn = m[j];
		}
	}
	printf("%d\n", Ans);
    return 0;
}