Cod sursa(job #2983416)

Utilizator gabriel10tm@gmail.comGabriel Marian [email protected] Data 22 februarie 2023 13:49:07
Problema Cutii Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <bits/stdc++.h>
using namespace std;
#if 1
#define cin fin
#define cout fout
ifstream fin("cutii.in");
ofstream fout("cutii.out");
#endif // 1
int n;
const int nmx = 3505;
typedef array<int,3> C;
vector<C> cut;
bool canFit(C c1, C c2){ // can box c1 fit in box c2 ?
    return c1[0] < c2[0] && c1[1] < c2[1] && c1[2] < c2[2];
}
int g[nmx][nmx]; // aciclic
int viz[nmx];
vector<int> tsort;
void dfs(int k){
    viz[k] = 1;
    for(int i=0;i<n;i++){
        if(g[k][i] && viz[i]==0)
            dfs(i);
    }
    tsort.push_back(k);
}
int lch[nmx];
void mdfs(int k){
    viz[k] = 1;
    for(int i=0;i<n;i++)
        if(g[k][i]){
            lch[i] = max(lch[i],lch[k] + 1);
            if(viz[i]==0){
                mdfs(i);
            }
        }
}
void solve(){
    fill(viz,viz+nmx,0);
    fill(lch,lch+nmx,0);
    tsort.clear();
    cut.clear();
    for(int i=0;i<n;i++){
        C c;
        cin >> c[0] >> c[1] >> c[2];
        cut.push_back(c);
    }
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            g[i][j] = canFit(cut[j],cut[i]);
    for(int i=0;i<n;i++)
        if(viz[i]==0)
            dfs(i);
    reverse(tsort.begin(),tsort.end());
    fill(viz,viz+nmx,0);
    for(int i=0;i<n;i++){
        if(viz[tsort[i]]==0)
            mdfs(tsort[i]);
    }
    int res = 0;
    for(int i=0;i<n;i++)
        res = max(res,lch[i]);
    cout << res+1 << "\n";
}

int main(){
    int t;
    cin >> n >> t;
    while(t--){
        solve();
    }
}