Cod sursa(job #1688427)

Utilizator preda.andreiPreda Andrei preda.andrei Data 13 aprilie 2016 14:57:10
Problema Cutii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <iostream>
#include <cstdio>

using namespace std;

struct Cutie{
    short int x, y, z;

    bool incape(Cutie c){
        return c.x > x && c.y > y && c.z > z;
    }
};

Cutie cutii[3501];
int d[3501];

void inter(Cutie &c1, Cutie &c2);
void sortare(int st, int dr);
inline int cmpCutii(Cutie c1, Cutie c2);

int main()
{
    FILE *fin = fopen("cutii.in", "r");
    FILE *fout = fopen("cutii.out", "w");

    int t, n, dmax = 0;

    fscanf(fin, "%d%d", &n, &t);

    while(t--){
        for(int i = 1; i <= n; ++i){
            fscanf(fin, "%hd%hd%hd", &cutii[i].x, &cutii[i].y, &cutii[i].z);
        }

        sortare(1, n);

        dmax = 0;
        for(int i = 1; i <= n; ++i){
            d[i] = 1;
            for(int j = i - 1; j >= 1; --j){
                if(d[j] + 1 > d[i] && cutii[j].incape(cutii[i])){
                    d[i] = d[j] + 1;
                }
            }

            if(d[i] > dmax)
                dmax = d[i];
        }

        fprintf(fout, "%d\n", dmax);
    }

    return 0;
}

void sortare(int st, int dr){
    if(st >= dr)
        return;

    int i = st + 1, j = dr;

    inter(cutii[st], cutii[st + (dr - st) / 2]);
    while(i <= j){
        while(i <= j && cmpCutii(cutii[st], cutii[i]) >= 0)
            ++i;
        while(i <= j && cmpCutii(cutii[st], cutii[j]) < 0)
            --j;
        if(i <= j){
            inter(cutii[i], cutii[j]);
            ++i;
            --j;
        }
    }
    --i;
    inter(cutii[st], cutii[i]);

    sortare(st, i - 1);
    sortare(i + 1, dr);
}

inline int cmpCutii(Cutie c1, Cutie c2){
    if(c1.x < c2.x)
        return -1;
    if(c1.x > c2.x)
        return 1;
    if(c1.y < c2.y)
        return -1;
    if(c1.y > c2.y)
        return 1;
    if(c1.z < c2.z)
        return -1;
    if(c1.z > c2.z)
        return 1;
    return 0;
}

void inter(Cutie &c1, Cutie &c2){
    Cutie caux = c1;
    c1 = c2;
    c2 = caux;
}