Cod sursa(job #843408)

Utilizator mihai995mihai995 mihai995 Data 27 decembrie 2012 22:23:28
Problema Euro Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <fstream>
using namespace std;

const int N = 35001;

struct Deque{
    struct Nod{
        long long a, b;
        int i;

        Nod(){
            i = 0;
        }

        Nod(int _a, int _b, int _i){
            a = _a;
            b = _b;
            i = _i;
        }

        int eval(int t){
            return a * t + b;
        }

        bool surpass(Nod x, Nod y){
            return x.a * b + a * y.b + y.a * x.b > x.b * a + b * y.a + y.b * x.a;
        }
    };

    Nod v[N];
    int st, dr;

    void push(int timp, int a, int b, int i){
        Nod x = Nod(a, b, i);

        while ( (st <= dr &&  v[dr].eval(timp) <= x.eval(timp) ) || ( st < dr &&  x.surpass(v[dr], v[dr - 1])))
            --dr;

        v[++dr] = x;
    }

    void reset(){
        st = 1;
        dr = 0;
    }

    int front(int timp){
        while (st < dr && v[st].eval(timp) <= v[st + 1].eval(timp))
            ++st;

        return v[st].i;
    }
};

long long S[N], v[N], T;
Deque D;
int n;

ifstream in("euro.in");
ofstream out("euro.out");

long long compute(){
    D.reset();

    D.push(0, 0, 0, n + 1);

    for (int i = n ; i ; i--){
        int j = D.front(S[i]);

        v[i] = v[j] + (j - 1) * (S[i] - S[j]) - T;

        D.push(S[i - 1], i - 1, v[i] - S[i] * (i - 1), i);
    }

    return v[1];
}

long long brute(){
    for (int i = n ; i ; i--){
        v[i] = n * S[i] - T;

        for (int j = i + 1 ; j <= n ; j++)
            v[i] = max(v[i], v[j] + (j - 1) * (S[i] - S[j]) - T);
    }

    return v[1];
}

int main(){
    in >> n >> T;

    for (int i = 1 ; i <= n ; i++)
        in >> S[i];

    for (int i = n - 1 ; i ; i--)
        S[i] += S[i + 1];

    //out << compute() << "\n";
    out << brute() << "\n";

    return 0;
}