B. Valerii Against Everyone(思维)Codeforces Round #682 (Div. 2)
原题链接; http://codeforces.com/contest/1438/problem/B

测试样例
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] a=[16,8,1,2,4,1]. Choosing l1=1, r1=1, l2=2 and r2=6 works because 16=(8+1+2+4+1).
In the second case, you can verify that there is no way to select to such subarrays.
题意: 给你一个数组 b b b,现在定义数组 a a a,其中 a i = 2 b i a_i=2^{b_i} ai=2bi。现在需要你找到 l 1 , r 1 , l 2 , r 2 l_1,r_1,l_2,r_2 l1,r1,l2,r2使得:
- 1 ≤ l 1 ≤ r 1 < l 2 ≤ r 2 ≤ n 1 \leq l_1 \leq r_1 \lt l_2 \leq r_2 \leq n 1≤l1≤r1<l2≤r2≤n
- a l 1 + a l 1 + 1 + … + a r 1 − 1 + a r 1 = a l 2 + a l 2 + 1 + … + a r 2 − 1 + a r 2 a_{l_1}+a_{l_1+1}+\ldots+a_{r_1-1}+a_{r_1} = a_{l_2}+a_{l_2+1}+\ldots+a_{r_2-1}+a_{r_2} al1+al1+1+…+ar1−1+ar1=al2+al2+1+…+ar2−1+ar2
若存在,则输出YES,否则输出NO。
解题思路: 我们首先观察一下实际上是在求
2
2
2的幂次方的和,使得它们相等。对于
2
,
4
,
8
,
16...
2,4,8,16...
2,4,8,16...
。我们发现这跨度一直在增加,如果我们要使得左右两边相等,必然是有元素可以弥补这跨度,即至少有一对相等的
b
i
b_i
bi值。这样才可以使得左右两边相等。而如果存在这样的,我们则可以直接取这两个元素。所以这题实际上我们是在判断数组
b
b
b中有没有元素相同的两个元素。
AC代码
/*
*邮箱:unique_powerhouse@qq.com
*blog:https://me.csdn.net/hzf0701
*注:文章若有任何问题请私信我或评论区留言,谢谢支持。
*
*/
#include<bits/stdc++.h>//POJ不支持
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=a;i>=n;i--)
using namespace std;
const int inf=0x3f3f3f3f;//无穷大。
const int maxn=1e5;//限定值。
typedef long long ll;
int t,n;
set<int> s;
int main(){
while(cin>>t){
while(t--){
cin>>n;
s.clear();
int temp;
rep(i,1,n){
cin>>temp;
s.insert(temp);
}
if(s.size()!=n){
cout<<"YES"<<endl;
}
else{
cout<<"NO"<<endl;
}
}
}
return 0;
}

浙公网安备 33010602011771号