Cod sursa(job #1126579)

Utilizator andrei.sfrentSfrent Andrei andrei.sfrent Data 27 februarie 2014 03:27:09
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#include <functional>

using namespace std;

int N, T;

struct cutie {
  int x, y, z;
  cutie(int x, int y, int z) : x(x), y(y), z(z) { }
};

#define cmp(c)                                            \
  [] (const cutie& a, const cutie& b) -> bool {           \
    return a.c < b.c;                                     \
  }

vector<cutie> compute_lis(
    const vector<cutie>& cutii,
    const function<bool(const cutie&, const cutie&)>& cmpfun) {
  vector<cutie> lis;
  for(const auto& c : cutii) {
    auto it = lower_bound(lis.begin(), lis.end(), c, cmpfun);
    if(it != lis.end()) *it = c;
    else lis.push_back(c);
  }
  return lis;
}

void solve_test() {
  vector<cutie> cutii;

  // read
  for(int i = 0; i < N; ++i) {
    int x, y, z;
    scanf("%d%d%d", &x, &y, &z);
    cutii.push_back(cutie(x, y, z));
  }

  // sort
  sort(cutii.begin(), cutii.end(), cmp(x));

  // longest increasing subsequence
  auto lis_y = compute_lis(cutii, cmp(y));
  auto lis_z = compute_lis(cutii, cmp(z));

  printf("%zu\n", lis_z.size());
}

int main(int argc, char *argv[]) {
  freopen("cutii.in", "r", stdin);
  freopen("cutii.out", "w", stdout);

  scanf("%d%d", &N, &T);
  while(T--) solve_test();

  return 0;
}