Cod sursa(job #462412)

Utilizator APOCALYPTODragos APOCALYPTO Data 10 iunie 2010 20:09:28
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
using namespace std;
#include<iostream>
#include<fstream>
#include<algorithm>
struct nod{ int x,y,z;};
nod v[3505];
int N,T,dp[3505];
int aib[3505][3505];

bool cmp(nod i,nod j) {return (i.x<j.x);}
ofstream fout("cutii.out");

inline int query(int y,int z)
{int v=0,i,j;
    for(i=y;i;i-=(i&-i))
      for(j=z;j;j-=(j&-j))
        v=max(v,aib[i][j]);

 return v;
}
inline void update(int y,int z,int v)
{int i,j;
    for(i=y;i<=N;i+=(i&-i))
     for(j=z;j<=N;j+=(j&-j))
      aib[i][j]=max(v,aib[i][j]);


}
inline void update2(int y,int z,int v)
{int i,j;
    for(i=y;i<=N;i+=(i&-i))
     for(j=z;j<=N;j+=(j&-j))
      aib[i][j]=v;


}
void cit()
{int i,j,k;
    ifstream fin("cutii.in");
    fin>>N>>T;
    for(k=1;k<=T;k++)
      {v[0].x=v[0].y=v[0].z=0;
      for(i=1;i<=N;i++) dp[i]=0;
      for(i=1;i<=N;i++)
      fin>>v[i].x>>v[i].y>>v[i].z;
      sort(v+1,v+N+1,cmp);
      /*for(i=1;i<=N;i++)
        for(j=1;j<i;j++)
         if(v[j].y<v[i].y&&v[j].z<v[i].z)
         {if(dp[j]+1>dp[i])
         dp[i]=dp[j]+1;
         }*/
      for(i=1;i<=N;i++)
        {dp[i]=1+query(v[i].y-1,v[i].z-1);
        update(v[i].y,v[i].z,dp[i]);
        }
      int max=0;
      for(i=1;i<=N;i++)
       if(max<dp[i])
        max=dp[i];
      for(i=1;i<=N;i++)
       update2(v[i].y,v[i].z,0);
      fout<<max<<"\n";


      }
}
int main()
{
    cit();

    fout.close();
    return 0;
}