简单的题,用优先队列来做。
#ifndef HEAD
#include <stdio.h>
#include <vector>
#include <math.h>
#include <string.h>
#include <string>
#include <iostream>
#include <queue>
#include <list>
#include <algorithm>
#include <stack>
#include <map>
using namespace std;
#endif // !HEAD
struct YF
{
int i;
int cost;
bool operator()(const YF& a1, const YF& a2)
{
return a1.cost > a2.cost;
}
};
int CCOSt[10001];
int main()
{
#ifdef _DEBUG
freopen("e:\\in.txt", "r", stdin);
#endif
int n, m;
memset(CCOSt, 0, sizeof(CCOSt));
scanf("%d %d\n", &n, &m);
priority_queue<YF, vector<YF>, YF> yfs;
long long totalcost = 0;
for (int i = 1; i <= n;i++)
{
int del;
YF yf;
scanf("%d %d\n", &yf.cost, &del);
CCOSt[i] = yf.cost;
yf.cost = yf.cost + (n - i) * m;
//CCOSt[i] = yf.cost;
yf.i = i;
yfs.push(yf);
int selecti = yfs.top().i;
totalcost += (((i - selecti) * m + CCOSt[selecti]) * del);
}
printf("%I64d\n", totalcost);
return 0;
}