Cod sursa(job #329979)

Utilizator DraStiKDragos Oprica DraStiK Data 8 iulie 2009 12:57:30
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <algorithm>
#define DIM 3505
using namespace std;

struct cutie {int x,y,z;} a[DIM];
char buff[DIM];
int best[DIM],last[DIM];
int t,n,maxim,poz;

void citire (int &x)
{

    for (x=0; buff[poz]<'0' || buff[poz]>'9'; )
          if (++poz==DIM)
          {
               fread (buff,1,DIM,stdin);
               poz=0;
          }
    for ( ; '0'<=buff[poz] && buff[poz]<='9'; )
    {
          x=x*10+buff[poz]-'0';
          if (++poz==DIM)
          {
               fread (buff,1,DIM,stdin);
               poz=0;
          }
    }
}

void read ()
{
    int i;
    for (i=1; i<=n; ++i)
    {
        citire (a[i].x);
        citire (a[i].y);
        citire (a[i].z);
    }
}

int cmp (cutie a,cutie b)
{
    return a.x<b.x || (a.x==b.x && a.y<b.y) || (a.x==b.x && a.y==b.y && a.z<b.z);
}

int max (int a,int b)
{
    if (a>b)
        return a;
    return b;
}

void solve ()
{
    int i,j,max_cur;
    best[1]=last[1]=maxim=1;
    for (i=2; i<=n; ++i)
    {
        for (max_cur=0, j=i-1; j>0; --j)
        {
            if (a[j].y<a[i].y && a[j].z<a[i].z)
                max_cur=max (max_cur,last[j]);
            if (best[j]<=max_cur)
                break;
        }
        maxim=max (maxim,best[i]=max (best[i-1],last[i]=max_cur+1));
    }
    printf ("%d\n",maxim);
}

int main ()
{
    freopen ("cutii.in","r",stdin);
    freopen ("cutii.out","w",stdout);
    int i;
    citire (n);
    citire (t);
    for (i=1; i<=t; ++i)
    {
        read ();
        sort (a+1,a+n+1,cmp);
        solve ();
    }
    return 0;
}