Pagini recente » Cod sursa (job #1707618) | Borderou de evaluare (job #1128051) | Borderou de evaluare (job #1617456) | Borderou de evaluare (job #2374037) | Cod sursa (job #2871051)
#include <bits/stdc++.h>
using namespace std;
ifstream in("heavymetal.in");
ofstream out("heavymetal.out");
const int N = 100001;
int n;
pair <int, int> a[N + 1];
int lg[N + 1], last[N + 1];
bool cmp(pair <int, int> a, pair <int, int> b)
{
if(a.second < b.second)
return 1;
else if (a.second == b.second && a.first < b.first)
return 1;
return 0;
}
bool ok(int a , int b , int x , int y)
{
if(a < x && x < b)
return true;
if(a < y && y < b)
return true;
if(x < a && a < y)
return true;
if(x < b && b < y)
return true;
return false;
}
int main()
{
in >> n;
for(int i = 1; i <= n; i++)
{
in >> a[i].first >> a[i].second;
}
sort(a + 1, a + n + 1, cmp);
vector <pair <int, int>> v;
int lmax = 0;
for(int i = 1; i <= n; i++)
{
v.push_back({a[i].first, a[i].second});
}
for(int i = 0; i < v.size(); i++)
{
if(v[i].first == v[i + 1].first && v[i + 1].second > v[i].second)
{
v.erase(v.begin()+ i);
}
}
for(int i = 0; i < v.size(); i++)
{
last[i] = -1;
lg[i] = 1;
for(int j = 0; j < i; j++)
if(lg[i] < lg[j] + 1 && !ok(v[j].first, v[j].second, v[i].first, v[i].second))
{
last[i] = j;
lg[i] = lg[j] + 1;
}
lmax = max(lmax, lg[i]);
}
int maxim = 0, poz = 0;
for(int i = 0; i < v.size(); i++)
{
if(lg[i] > maxim)
{
maxim = lg[i];
poz = i;
}
}
vector <pair <int, int>> ans;
while(poz != -1)
{
ans.push_back(v[poz]);
poz = last[poz];
}
int sum = 0;
for(int i = 0; i < ans.size(); i++)
{
sum += (ans[i].second - ans[i].first);
}
out << sum;
return 0;
}