Cod sursa(job #2951478)

Utilizator Pop_EmilPal Tamas Pop_Emil Data 6 decembrie 2022 16:45:17
Problema Cutii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.78 kb
#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;
}