Cod sursa(job #1806579)

Utilizator DanielRusuDaniel Rusu DanielRusu Data 15 noiembrie 2016 15:37:03
Problema Cutii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <cstdio>
#include <algorithm>

using namespace std;

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

int N, T;

struct cutie {
    int x, y, z;
} V[3505];

vector <vector <int> > AIB;

bool cmp(cutie a, cutie b) {
    if(a.x == b.x) {
        return a.y < b.y;
    }

    return a.x < b.x;
}

void Update(int x, int y, int val) {
    for(int i = x; i <= N; i += i & (-i)) {
        for(int j = y; j <= N; j += j & (-j)) {
            AIB[i][j] = max(AIB[i][j], val);
        }
    }
}

void Clr(int x, int y) {
    for(int i = x; i <= N; i += i & (-i)) {
        for(int j = y; j <= N; j += j & (-j)) {
            AIB[i][j] = 0;
        }
    }
}

int Query(int x, int y) {
    int ans = 0;

    for(int i = x; i; i -= i & (-i)) {
        for(int j = y; j; j -= j & (-j)) {
            ans = max(ans, AIB[i][j]);
        }
    }

    return ans;
}

int main() {
    fscanf(fin, "%d %d\n", &N, &T);

    while(T--) {
        for(int i = 1; i <= N; ++i) {
            fscanf(fin, "%d %d %d\n", &V[i].x, &V[i].y, &V[i].z);
        }

        sort(V + 1, V + 1 + N, cmp);

        AIB.clear();
        AIB.resize(N + 1, vector <int> (N + 1));

        int mx = 0;
        for(int i = 1; i <= N; ++i) {
            int rez = Query(V[i].y, V[i].z);

            mx = max(mx, rez + 1);

            Update(V[i].y, V[i].z, rez + 1);
        }

        for(int i = 1; i <= N; ++i) {
            Clr(V[i].y, V[i].z);
        }

//        if(T) {
//            for(int i = 1; i <= N; ++i) {
//                for(int j = 1; j <= N; ++j) {
//                    AIB[i][j] = 0;
//                }
//            }
//        }

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

    fclose(fin);
    fclose(fout);

    return 0;
}