Cod sursa(job #216619)

Utilizator zombie_testertest test zombie_tester Data 24 octombrie 2008 23:42:55
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.38 kb
# include <cstdio>
# include <string.h>
# include <algorithm>

using namespace std;

# define FIN "cutii.in"
# define FOUT "cutii.out"
# define max(a,b) (a > b ? a : b)
# define MAXN 3510

struct Box
{
   int x,y,z;
} C[MAXN];

int N,T,i,j,k,rez,val,c,l;
int A[MAXN][MAXN];
char s[50];

    int cmp(Box A, Box B)
    {
        return A.z < B.z;
    }
    
    void update(int l,int c)
    {
        int i,j;
        
        for (i = l; i <= N; i += i^(i-1)&i)
          for (j = c; j <= N; j += j^(j-1)&j)
            A[i][j] = max(A[i][j],val);
    }
    
    void erase(int l,int c)
    {
        int i,j;
        
        for (i = l; i <= N; i += i^(i-1)&i)
          for (j = c; j <= N; j += j^(j-1)&j)
            A[i][j] = 0;
    }
    
    void query(int l, int c)
    {
        int i,j;
        
        for (i = l; i; i -= i^(i-1)&i)
          for (j = c; j; j -= j^(j-1)&j)
            val = max(val,A[i][j]); 
    }

    int main()
    {
        freopen(FIN,"r",stdin);
        freopen(FOUT,"w",stdout);
        
        scanf("%d%d\n",&N,&T);
        for (k = 1; k <= T; ++k)
          {
               rez = 1;
               
               for (i = 1; i <= N; ++i)
                 {
                    gets(s+1);
                    
                    C[i].x = C[i].y = C[i].z = 0;
                    
                    l = strlen(s+1);
                    for (j = 1; s[j] != ' '; ++j, c = j + 1)
                      C[i].x = C[i].x * 10 + (s[j] - '0');
                    for (j = c; s[j] != ' '; ++j, c = j + 1)
                      C[i].y = C[i].y * 10 + (s[j] - '0');
                    for (j = c; j <= l; ++j)
                      C[i].z = C[i].z * 10 + (s[j] - '0');
                 }
                 
               sort(C+1,C+N+1,cmp);
               
               val = 1;
               update(C[1].x,C[1].y);
               
               for (i = 2; i <= N; ++i)
                 {
                     val = 0;
                     query(C[i].x-1,C[i].y-1);
                     val++;
                     update(C[i].x,C[i].y);
                     if (val > rez) rez = val;
                 }
               
               for (i = 1; i <= N; ++i)
                 erase(C[i].x,C[i].y);
               
               printf("%d\n",rez);
          }
        
        return 0;
    }