Pagini recente » Cod sursa (job #1499042) | Cod sursa (job #2908844) | Cod sursa (job #3199469) | Cod sursa (job #134434) | Cod sursa (job #2454032)
#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;
}