#include <bits/stdc++.h>
using namespace std;
int main()
{
cin.tie(0);
cout.tie(0);
ios_base::sync_with_stdio(0);
long long N, K;
cin >> N >> K;
long long MAXX = 10000000000000000;
vector<pair<long long, long long>> Tab;
vector<long long> Hs;
for (long long i = 0; i < N; i++)
{
long long h, c;
cin >> h >> c;
Tab.push_back({h, c});
Hs.push_back(h);
}
sort(Tab.begin(), Tab.end());
sort(Hs.begin(), Hs.end());
vector<long long> minn(N + 1, MAXX);
for (long long i = 0; i < N; i++)
{
minn[i] = Tab[i].second;
if (i > 0)
{
minn[i] = min(minn[i], minn[i - 1]);
Hs[i] = max(Hs[i], Hs[i - 1] + 1);
}
}
vector<vector<long long>> dp(N + 1, vector<long long>(N + 1, MAXX)), dp2(N + 1, vector<long long>(N + 1, MAXX));
dp[0][1] = 0;
long long buff = 0, best = MAXX, prev = 0;
for (long long i = 0; i < N; i++)
{
prev = buff;
while (buff < N && Tab[buff].first <= Hs[i])
buff++;
for (long long j = 0; j < N; j++)
{
for (long long k = 1; k <= N; k++)
{
if (dp[j][k] >= MAXX)
continue;
// dp2[j][k] = min(dp2[j][k], dp[j][k] + (buff - j) * K);
for (long long l = min(buff, j + k); l <= buff; l++)
{
long long add = l - min(l, j + k);
dp2[l][k + add] = min(dp2[l][k + add], dp[j][k] + (minn[((prev == 0) ? N : (prev - 1))] * add) + (buff - l) * K);
}
}
}
for (long long k = 0; k < N + 1; k++)
best = min(best, dp2[N][k]);
swap(dp, dp2);
dp2.assign(N + 1, vector<long long>(N + 1, MAXX));
}
cout << best;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |