//很考想法啊,把五个区间分成200*200,200*200,200来搞。注意:过的时候要用__int64为来过(输出:%I64d)
AC代码:
?
#include#include #include using namespace std ; #define N 205 __int64 num [6 ][N ]; __int64 s0 [N *N ]; __int64 s1 [N *N ]; __int64 s2 [N ]; int main() { int x ; scanf (%d ,&x ); while(x --) { int n ; scanf (%d ,&n ); int i ,j ; for(i =1 ;i <=5 ;i ++) { for(j =1 ;j <=n ;j ++) { scanf (%I64d ,&num [i ][j ]); } } int cnt =0 ; for(i =1 ;i <=n ;i ++) { for(j =1 ;j <=n ;j ++) { s0 [cnt ++]=num [1 ][i ]+num [2 ][j ]; } } int l0 =cnt ; cnt =0 ; for(i =1 ;i <=n ;i ++) { for(j =1 ;j <=n ;j ++) { s1 [cnt ++]=num [3 ][i ]+num [4 ][j ]; } } int l1 =cnt ; cnt =0 ; for(i =1 ;i <=n ;i ++) { s2 [cnt ++]=num [5 ][i ]; } int l2 =cnt ; sort (s0 ,s0 +l0 ); sort (s1 ,s1 +l1 ); sort (s2 ,s2 +l2 ); int ok =0 ; int k ; for(i =0 ;i <l2 &&ok ==0 ;i ++) { j =0 ,k =l0 -1 ; while(j <l1 &&k >=0 ) { if((s0 [k ]+s1 [j ]+s2 [i ])==0 ) { ok =1 ; break; } else if((s0 [k ]+s1 [j ]+s2 [i ])>0 ) { k --; } else { j ++; } } } if(ok ) { printf (Yes ); } else { printf (No ); } } return 0 ; }
?
?