Cod sursa(job #2715643)

Utilizator AndreibatmanAndrei Croitoriu Andreibatman Data 3 martie 2021 22:28:28
Problema Cutii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("cutii.in");
ofstream fout("cutii.out");
struct ceva
{
    int x,y,z;
} v[3510],best[3510];
int n,i,j,maxi,m,poz,lg,t;
bool cmp(ceva a,ceva b)
{
    if(a.x!=b.x)return a.x<b.x;
    if(a.y!=b.y)return a.y<b.y;
    return a.z<b.z;
}
int verif(int a,int b)
{
    return (best[a].x<=v[b].x && best[a].y<=v[b].y && best[a].z<=v[b].z &&
            best[a].x>v[b-1].x && best[a].y>v[b-1].y && best[a].z>v[b-1].z);
}
int cb(int x)
{
    int st=1,dr=lg,mij,ok=1;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(verif(mij,x))
            st=mij+1;
        else
        {
            dr=mij-1;
            ok=mij;
        }
    }
    return ok;
}
void make_dp()
{
    best[1]=v[1];
    lg=1;
    for(i=2; i<=n; i++)
    {
        if(v[i].x>best[lg].x && v[i].y>best[lg].y && v[i].z>best[lg].z)
            best[++lg]=v[i];
        else
        {
            poz=cb(i);
            best[poz]=v[i];
        }
    }
    fout<<lg<<'\n';
    for(i=1; i<=lg; i++)
        best[i].x=best[i].y=best[i].z=0;
}
int main()
{
    fin>>n>>t;
    while(t--)
    {
        for(i=1; i<=n; i++)
            fin>>v[i].x>>v[i].y>>v[i].z,best[i].x=best[i].y=best[i].z=0;
        sort(v+1,v+n+1,cmp);
        make_dp();
    }
    return 0;
}