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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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) 编辑 收藏 举报