Cod sursa(job #587247)

Utilizator katakunaCazacu Alexandru katakuna Data 4 mai 2011 14:05:22
Problema Avioane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <cstdio>
#include <algorithm>
#include <string.h>
using namespace std;

#define Nmax 100010

struct stiva {
	long long st, dr;
	long long p;
} S[Nmax];

int n;
long long v[Nmax];

void rezolva () {

	int N = 0;
	S[++N].p = 1; S[N].st = 1; S[N].dr = n;

	long long i, j, k;
	for (i = 2; i <= n; i++) {

        k = (i - S[N].p + 1 ) * v[ S[N].p ] - v[i];
        if (k <= 0)
            k = i;
        else
            if (v[i] - v[ S[N].p ] != 0) k = i + k / (v[i] - v[ S[N].p ]) + 1;
            else k = n + 1;

        k++;

		while (k <= n && k <= S[N].st) {
			S[N].p = i;
			S[N].dr = n;

			N--;
            if (!N) break;

	 		k = (i - S[N].p + 1 ) * v[ S[N].p ] - v[i];
            if (k <= 0)
                k = i;
            else
                if (v[i] - v[ S[N].p ] != 0) k = i + k / (v[i] - v[ S[N].p ]) + 1;
                else k = n + 1;

            k++;
		}

		if (k > n || N == 0) {
			if (S[N + 1].p == i) N++;
		}
		else {
			S[N].dr = k-1;
			S[++N].p = i;
			S[N].st = k; S[N].dr = n;
		}
	}


	long long sol = 0, cst;
	for (i = 1; i <= N; i++)
		for (j = S[i].st; j <= S[i].dr; j++) {
			cst = v[j] * (n - j + 1) + v[ S[i].p ] * (j - S[i].p);
			if (sol < cst) sol = cst;
		}

    printf ("%lld\n", sol);
}

int main () {

	freopen ("avioane.in", "r", stdin);
	freopen ("avioane.out", "w", stdout);

	scanf ("%d", &n);
	for (int i = 1; i <= n; i++)
		scanf ("%lld", &v[i]);

	sort (v + 1, v + n + 1);

	rezolva ();

	return 0;
}