HDU 4334 Trouble

算法:

比赛时,最先想到的是O( N * N * N + N ^2 * log (N * N * N )) = O( N * N*N)的时间复杂度。

N <= 200,5s中肯定不会超时。

写出来提交MLE。。然后计算下内存

要开800 0000数组,long long 型。

M = 800 0000 * 8 = 6400 0000 字节 = 61 M, 只能开4000000

然后开40000数组。。

时间复杂度变成O( N ^ 3 * log N )

提交TLE。。

泪奔,改为HASH。。

O(N * N * N)静态链表处理冲突。。

AC。4000多ms...时间好高,旭哈希过的1600ms..

原因是我定义的long long hash[],每次memset好浪费时间。。

标程算法是:

合并1,2集合,排序,合并3,4集合排序,然后查找。。左右逼近

时间复杂度O(N*N*N)

写了下,竟然排到第一名去了,700多ms

View Code
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<vector>
#include<string>
#include<math.h>
#include<map>
#include<set>
#include<algorithm>
using namespace std;

#define HASH 1000003

long long f[6][210];

int hash[1000013];
long long sum[40010];


struct node
{
  long long v;
  int next;
}h[HASH+10];

int n;

void add( long long x )
{
  long long y = x;
  if( y < 0 ) y = -y;
  y %= HASH;
  for( int e = hash[y];e != -1; e = h[e].next)
  {
     if( h[e].v == x )
         return;          
  }
  h[n].v = x;
  h[n].next = hash[y];
  hash[y] = n++;      
}

bool find(long long x)
{
   long long y = x;
   if( y < 0 ) y = -y;
    y %= HASH;
   for( int e = hash[y]; e != -1; e = h[e].next)
   {
      if( h[e].v == x )
          return true;     
   }
   return false;   
}

int main( )
{
  int T, N;
  scanf("%d",&T);
  while( T-- )
  {
     scanf("%d",&N);
     for( int i = 1; i <= 5; i++)
     {
        for( int j = 1; j <= N; j++)
             scanf("%I64d",&f[i][j]);
          
     }
     long long cnt = 0;
     n = 0;
     for( int v = 1; v <= N; v++)
     {               
        for( int u = 1; u <= N; u++)
        { 
            
             sum[cnt++] = f[1][v] + f[2][u];             

                          
        }
                      
      }           
      memset(hash,-1,sizeof(hash));
      long long tt;           
      for( int v = 1; v <= N; v++)
      {
           for( int j = 1; j <= N; j++)
           {
                tt = f[4][v] + f[5][j];     
                add( tt );                 
           }
      }
      int fx = 0;
      for( int i = 0; i < cnt; i++)
      {
         for( int j = 1; j <= N; j++)
         {
             long long x = 0 - sum[i] - f[3][j];
             if( find(x) )
             {
                puts("Yes");
                fx = 1;    
                break; 
             }        
              
         }
         if( fx )
             break;
      }
      if( !fx )
          puts("No");     
      
    
  }
  return 0;
}
View Code
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<vector>
#include<string>
#include<math.h>
#include<map>
#include<set>
#include<algorithm>
using namespace std;
#define MAXN 201
long long L1[MAXN];
long long L2[MAXN * MAXN];
long long L3[MAXN * MAXN];

int main( )
{
 int T,N;
 scanf("%d",&T);
 while( T-- )
 {
   scanf("%d",&N);
   for( int i = 1; i <= N; i++)
   {
      scanf("%I64d",&L1[i]);     
   }
   long long t;
   long long p1 = 0, p2 = 0;
   for( int i = 1; i <= N; i++)
   {
      scanf("%I64d",&t);
      for( int j = 1; j <= N; j++)
      {
         L2[p1++] = L1[j] + t;     
      }     
   }
   for( int i = 1; i <= N; i++)
   {
      scanf("%I64d",&L1[i]);     
   }
   for( int i = 1; i <= N; i++)
   {
      scanf("%I64d",&t);
      for( int j = 1; j <= N; j++)
      {
         L3[p2++] = L1[j] + t;     
      }     
   }
   sort( L2, L2 + p1 );
   sort( L3, L3 + p2 );
   p1 = unique(L2, L2 + p1) - L2;
   p2 = unique(L3, L3 + p2) - L3;
   for( int i = 1; i <= N; i++)
   {
      scanf("%I64d",&L1[i]);     
   }
   int flag = 0, q1, q2;
   for( int i = 1; i <= N && !flag; i++)
   {
       q1 = 0, q2 = p2;
       long long temp = -L1[i];
       while ( q1 < p1 && q2 >= 0 )
       {
           long long xx = L2[q1] + L3[q2];
           if ( xx > temp )
              q2--;
           else if( xx < temp )
              q1++;
           else
           {
              flag = 1;
              break;
           }
             
       }
        
   }
   if( flag )
       puts("Yes");
   else
       puts("No");
         
 }
 return 0;
}

 

 

posted on 2012-08-02 21:51  more think, more gains  阅读(130)  评论(0编辑  收藏  举报

导航