//很考想法啊,把五个区间分成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
; }
?
?