Cod sursa(job #2454032)

Utilizator mirceatlxhaha haha mirceatlx Data 7 septembrie 2019 08:09:09
Problema Branza Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <deque>
#include <vector>
#define maxVectorSize 100005
using namespace std;

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

struct Stats{

    int position, price, number;
};

int weekNumber, depositPrice, outOfDateTime;
long long result = 0;
vector < Stats > weekStats(maxVectorSize);
deque < Stats > primeDeque;

int main()
{
    int price, number;
    fin >> weekNumber >> depositPrice >> outOfDateTime;
    for(int i = 1 ; i <= weekNumber; i++)
    {
        fin >> price >> number;
        weekStats[i].price = price;
        weekStats[i].number = number;
        weekStats[i].position = i;
    }
    primeDeque.push_back(weekStats[1]);
    result += weekStats[1].price * weekStats[1].number * 1LL;
    for(int i = 2 ; i <= weekNumber ; i++)
    {
        while(!primeDeque.empty() && weekStats[i].position - primeDeque.front().position > outOfDateTime - 1)
            primeDeque.pop_front();
        while(!primeDeque.empty() && (weekStats[i].price < primeDeque.back().price || weekStats[i].price - primeDeque.back().price <= depositPrice))
            primeDeque.pop_back();
        if(!primeDeque.empty() && 1LL * primeDeque.front().price * weekStats[i].number + 1LL * depositPrice * (weekStats[i].position - primeDeque.front().position) * weekStats[i].number < weekStats[i].price * weekStats[i].number * 1LL)
        {
            result += 1LL * primeDeque.front().price * weekStats[i].number + 1LL * depositPrice * (weekStats[i].position - primeDeque.front().position) * weekStats[i].number;
        }
        else
        {
            result += weekStats[i].price * weekStats[i].number * 1LL;
        }
        primeDeque.push_back(weekStats[i]);
        
    }
    fout << result << "\n";
    return 0;
}