Valerii Against Everyone
您将得到一个长度为n的数组b。让我们定义另一个数组a,其长度也为n,其中ai = 2^bi(1≤i≤n)。
Valerii说,每两个不相交的子数组具有不同的元素和。您想确定他是否错了。更正式地讲,您需要确定是否存在满足以下条件的四个整数l1,r1,l2,r2:
1≤l1≤r1<l2≤r2≤n;
al1 + al1 + 1 + ... + ar1-1 + ar1 = al2 + al2 + 1 + ... + ar2-1 + ar2。
如果存在这四个整数,则将证明Valerii错误。它们存在吗?
如果可以通过从开头删除几个(可能为零或全部)元素并从结尾删除几个(可能为零或全部)元素而从d获得c,则数组c是数组d的子数组。
输入值
每个测试包含多个测试用例。第一行包含测试用例的数量t(1≤t≤100)。测试用例的说明如下。
每个测试用例的第一行包含一个整数n(2≤n≤1000)。
每个测试用例的第二行包含n个整数b1,b2,…,bn(0≤bi≤109)。
输出量
对于每个测试用例,如果在中存在两个不相交的子数组,它们的总和相同,则在单独的行上输出YES。否则,在单独的行上输出NO。
另外,请注意,每个字母都可以。
Example
input
2
6
4 3 0 1 2 0
2
2 5
output
YES
NO
Note
In the first case, a=[16,8,1,2,4,1]a=[16,8,1,2,4,1]. Choosing l1=1l1=1, r1=1r1=1, l2=2l2=2 and r2=6r2=6 works because 16=(8+1+2+4+1)16=(8+1+2+4+1).
In the second case, you can verify that there is no way to select to such subarrays.
分析
定义了数组bi和数组ai;
数组ai=2^bi;
ai中存在两个不相交的子数组,它们的总和相同,1,2,4,8,16,32,64;观察之后可以发现,(1+2+4)!=8,要满足题目要求,必须严存在2个相同的元素,例如2个8;题目就可以转化为判断数组中是否存在2个相同的元素,如果存在,则输出YES,如果不存在,则输出NO;
AC代码
#include<bits/stdc++.h>
using namespace std;
int n;
int t;
map<int,int>mp;
int main()
{
cin>>t;
while(t--)
{
cin>>n;
mp.clear();
int flag=0;
for(int i=1;i<=n;i++)
{
int a;
cin>>a;
if(mp[a]) flag=1;
mp[a]=1;
}
if(flag) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}