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 1l1r1<l2r2n
  • 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++ar11+ar1=al2+al2+1++ar21+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;
}
posted @ 2022-03-26 16:49  unique_pursuit  阅读(39)  评论(0)    收藏  举报