【codeforce】#682 B

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;
 } 
原文地址:https://www.cnblogs.com/tazimi/p/13997934.html