Pagini recente » Cod sursa (job #1160833) | Cod sursa (job #630550) | Cod sursa (job #3191914) | Cod sursa (job #1213930) | Cod sursa (job #1403368)
#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!