Pagini recente » Cod sursa (job #2757379) | Cod sursa (job #2150352) | Cod sursa (job #1302795) | Cod sursa (job #621842) | Cod sursa (job #2511571)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream in("heavymetal.in");
ofstream out("heavymetal.out");
bool cmp(pair <int, int> &A, pair <int, int> &B) {
if (A.second < B.second)
return true;
if (A.second > B.second)
return false;
return A.first < B.first;
}
int main() {
int n;
in >> n;
vector <pair <int, int>> form(n);
for (int i = 0; i < n; i++) {
in >> form[i].first >> form[i].second;
}
sort(form.begin(), form.end(), cmp);
for (auto &&el: form) {
cout << el.first << '\n';
}
// dp[i] - cel mai bun cost daca selectam spectalolele din primele i (dupa capatul din dreapta)
// dp[i] = max(dp[i - 1], form[i].y - form[i].x + dp[j] | j - cel mai mare index a.i. y.index < x.i)
vector <int> dp(n);
dp[0] = form[0].second - form[0].first;
int left, right, middle, val, nr;
for (int i = 1; i < n; i++) {
val = -1;
left = 0;
right = i - 1;
while (left <= right) {
middle = left + (right - left) / 2;
if (form[middle].second <= form[i].first) {
val = middle;
left = middle + 1;
}
else {
right = middle - 1;
}
}
dp[i] = dp[i - 1];
if (val > -1) {
nr = dp[val] + form[i].second - form[i].first;
if (dp[i] < nr)
dp[i] = nr;
}
}
out << dp[n - 1];
return 0;
}