三相数组
时间限制:1秒 内存限制:128M
题目描述
小可给一种神奇的数组起了一个名字叫做“三相数组”。
在一个三相数组a中,对于任意的三个不同的下标i,j,k,ai+aj+ak是数组中的一个元素。并且只有满足这个性质的数组才能叫三相数组。
现在小可手里有好多数组,请你帮忙判断一下,小可给出的数组是否是一个三相数组
输入描述
第一行一个正整数T(1≤T≤1000),代表小可手里有T个数组。
对于接下来的每组输入,第一行一个正整数n(3≤n≤2×10^5),代表数组中的元素数量。第二行有n个整数
a1,a2,⋯,an(−10^9≤ai≤10^9),代表数组中的元素。
保证这T个数组的长度总和不超过2×10^5。
输出描述
对于给定的每个数组,如果是三相数组,输出YES,否则输出NO。
样例输入
4
3
-1 0 1
5
1 -2 -2 1 -3
6
0 0 0 0 0 0
4
-1 2 -3 4
样例输出
YES
NO
YES
NO
话不多说上代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int t,n,x;
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
vector<int> v;
map<int,bool> mp;
int flag1=0,flag2=0,flag3=0;
for(int i=1;i<=n;i++){
scanf("%d",&x);
mp[x]=1;
if(x==0&&!flag3){
flag3=1;
v.push_back(x);
}
else if(x<0){
flag1++;
v.push_back(x);
}
else if(x>0){
flag2++;
v.push_back(x);
}
}
if(flag1>=3||flag2>=3){
printf("NO\n");
continue;
}
int lim=v.size(),flag4=1;
for(int i=0;i<lim&&flag4;i++){
for(int j=0;j<lim&&flag4;j++){
for(int k=0;k<lim&&flag4;k++){
if(i!=j&&j!=k&&i!=k){
if(!mp[v[i]+v[j]+v[k]]){
flag4=0;
}
}
}
}
}
if(flag4){
printf("YES\n");
}
else{
printf("NO\n");
}
}
return 0;
}