Cod sursa(job #1403368)

Utilizator CostanMiriamCostan Miriam CostanMiriam Data 27 martie 2015 11:20:52
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <fstream>
#include <algorithm>

#define DIM 3510
#define lsb(i) i&(-i)

using namespace std;

ifstream fin ("cutii.in");
ofstream fout ("cutii.out");

int a[DIM][DIM]; //AIB 2D

int testsCount;

int n, sum, maxim;

struct data {

    int x;
    int y;
    int z;

}boxes[DIM];

bool cmp (data x, data y) {

    return x.z < y.z;

}

void update(int x, int y) {

    //Facem update de la pozitiile x, y cu 1
    //Pe i, j putem adauga o cutie cu x, y <= i, j

    for (int i = x; i <= n; i += lsb(i)) {

        for (int j = y; j <= n; j += lsb(j))
            a[i][j] = max(a[i][j], sum + 1);

    }

}

void query (int x, int y) {

    //Interogam cate cutii cu dimensiunile mai mici sau egale cu x si y exista

    for (int i = x; i > 0; i -= lsb(i)) {

        for (int j = y; j > 0; j -= lsb(j))
            sum = max(sum, a[i][j]);

    }

    //calculam maximul
    if (sum + 1 > maxim)
        maxim = sum + 1;
}

int main() {

    fin >> n >> testsCount;

    while (testsCount--) {

        maxim=0;

        //Citim dimensiunile celor n cutii
        for (int i = 1; i <= n; i++)
            fin >> boxes[i].x >> boxes[i].y >> boxes[i].z;

        //Sortam cutiile dupa una din dimensiuni(in acest caz z)
        sort (boxes + 1, boxes + n + 1, cmp);

        for (int i = 1; i <= n; i++) {

            sum=0;

            query (boxes[i].x - 1, boxes[i].y - 1);

            update (boxes[i].x, boxes[i].y);

        }

        fout << maxim << "\n";

        //Reinitializam matricea de AIB cu 0
        //Pentru a economisi timp vom reinitializa doar pozitiile ce au fost folosite in AIB
        // Complexitatea se reduce de la O(n * n) O(n * log ^ 2 (n) )
        for (int i = 1; i <= n; i++) {

            for (int j = boxes[i].x; j <= n; j += lsb(j)) {

                for (int k = boxes[i].y; k <= n; k += lsb(k))
                    a[j][k] = 0;

            }

        }

    }

    return 0;

}

//Trust me, I'm the Doctor!
//Miriam e tare!