Pagini recente » Cod sursa (job #3272480) | Cod sursa (job #138691) | Cod sursa (job #138794) | Cod sursa (job #879443) | Cod sursa (job #2951478)
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <vector>
#include <set>
#include <bits/stdc++.h>
using namespace std;
FILE *in = fopen("cutii.in", "r"), *out = fopen("cutii.out", "w");
#define MaxN 3505
#define dimens 3
int N, T, result;
int BIT[dimens][MaxN], origid[dimens][MaxN], lengths[dimens][MaxN], pre[dimens][MaxN];
struct Box {
int dims[3];
} v[MaxN];
int query(int d, int pos){
int i = pos, max_pos = 0;
while(i){
if (BIT[d][i] > BIT[d][max_pos])
max_pos = i;
i -= i & (-i);
}
return max_pos;
}
void update(int d, int nr, int length, int pos){
int i = nr;
while (i <= N){
if (BIT[d][i] < length){
BIT[d][i] = length;
origid[d][i] = pos;
}
i += i & (-i);
}
}
int main()
{
fscanf(in, "%d %d", &N, &T);
while(T--) {
for(int i = 1; i <= N; ++i)
fscanf(in, "%d %d %d", &v[i].dims[0], &v[i].dims[1], &v[i].dims[2]);
result = 1;
int max_pos;
for (int sd = 0; sd < 3; ++sd){
sort(v, v + N, [&sd](Box a, Box b) { return a.dims[sd] < b.dims[sd]; });
memset(BIT, 0, sizeof(BIT));
vector<set<int>> idx_sets [2];
int i_idx_sets = 0;
for(int d = 0; d < 3; ++d){
if (d != sd){
for(int i = 1; i <= N; ++i){
max_pos = query(d, v[i].dims[d] - 1);
pre[d][i] = origid[d][max_pos];
lengths[d][i] = BIT[d][max_pos] + 1;
update(d, v[i].dims[d], BIT[d][max_pos] + 1, i);
}
int max_len_pos = 0;
for(int i = 1; i <= N; ++i)
if (lengths[d][i] > lengths[d][max_len_pos])
max_len_pos = i;
for(int i = 1; i <= N; ++i)
if (lengths[d][i] == lengths[d][max_len_pos]){
set<int> idxs;
for(int j = i; j; j = pre[d][j])
idxs.insert(j);
idx_sets[i_idx_sets].push_back(idxs);
}
++i_idx_sets;
}
}
set<int> temp;
for(auto set1: idx_sets[0])
for(auto set2: idx_sets[1]){
temp.clear();
std::set_intersection(set1.begin(), set1.end(), set2.begin(), set2.end(), std::inserter(temp, temp.begin()));
if(temp.size() > result)
result = temp.size();
}
}
fprintf(out, "%d\n", result);
}
return 0;
}