Cod sursa(job #2971121)

Utilizator 222cezarCezar Stilpeanu 222cezar Data 26 ianuarie 2023 18:07:01
Problema Problema rucsacului Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.02 kb
#include <fstream>
#include <algorithm>
using namespace std;

ifstream cin("drept.in");
ofstream cout("drept.out");

int n, lung[100005], val_min[200010];

int cb(int v[], int sz, int val)
{
  int st = 1, dr = sz, rez = 0;
  while(st <= dr)
  {
    int m = (st + dr) / 2;
    if(v[m] < val)
    {
      rez = m;
      st = m + 1;
    }
    else
    {
      dr = m - 1;
    }
  }
  return rez;
}

pair<int, int> s[100005];
signed main()
{
  cin >> n;
  for(int i = 1; i <= n; i++)
  {
    int L, l;
    cin >> L >> l;
    s[i] = {L, l};
  }
  sort(s + 1, s + n + 1, [&](auto x, auto y) { if(x.first == y.first) return x.second > y.second; else return x.first < y.first;});

  int n_val_min = 0, pmax = 1;
  for(int i = 1; i <= n; i++)
  {
    int l = s[i].second;
    int j0 = cb(val_min, n_val_min, l);
    if(j0 == n_val_min)
    {
      n_val_min++;
    }
    lung[i] = 1 + j0;
    val_min[lung[i]] = l;
    if(lung[i] > lung[pmax])
    {
      pmax = i;
    }
  }
  cout << lung[pmax];
}