Cod sursa(job #1006720)

Utilizator marcu.iulian13Iulian Marcu marcu.iulian13 Data 7 octombrie 2013 17:13:37
Problema Cutii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <cstdio>
using namespace std;

struct box {
    int x, y, z;
};

int n, t;
box a[3500];
int sol[3500];

void read() {
    for(int i = 0; i < n; i++)
        scanf("%d %d %d", &a[i].x, &a[i].y, &a[i].z);
}

void swap(box &a, box &b) {
    box t = a;
    a = b;
    b = t;
}

int divide(int l, int r) {
    box p = a[l];
    while(l < r) {
        while(a[l].z < p.z) l++;
        while(a[r].z > p.z) r--;
        if(l < r) swap(a[l], a[r]);
    }
    return l;
}

void quicksort(int l, int r) {
    int m = divide(l, r);
    if(l < m) quicksort(l, m - 1);
    if(r > m) quicksort(m + 1, r);
}

int maxsol(int p) {
    int m = 0;
    for(int i = n - 1; i > p; i--)
        if(sol[i] > m && (a[i].x > a[p].x && a[i].y > a[p].y && a[i].z > a[p].z))
            m = sol[i];
    return m;
}

void solve() {
    freopen("cutii.in", "r", stdin);
    scanf("%d %d", &n, &t);

    freopen("cutii.out", "w", stdout);
    while(t > 0) {
        read();
        quicksort(0, n - 1);
        sol[n - 1] = 1;
        int m = 1;
        for(int i = n - 2; i >= 0; i--) {
            sol[i] = maxsol(i) + 1;
            if(sol[i] > m) m = sol[i];
        }
        printf("%d\n", m);
        t--;
    }
    fclose(stdin);
    fclose(stdout);
}

int main() {
    solve();
    return 0;
}