Codeforces Round #682 (Div. 2)B. Valerii Against Everyone

题目链接:
https://codeforces.com/contest/1438/problem/B

**

题目大意:

给定bi,会生成一个ai,ai=2^bi。 然后要求找出4个数,l1,r1,l2,r2.满足
1≤l1≤r1<l2≤r2≤n;
al1+al1+1+…+ar1−1+ar1=al2+al2+1+…+ar2−1+ar2.
输出YES or NO

思路
看到bi范围那么大肯定就不是暴力了。想半天结论竟然没推出来。。

1.要想让两个区间相等,那么最好的就是找两个数相等。所以,如果有两个数相等,那么一定可以,YES
2.如果没有两个数相等,那么2^n= 2*2^(n-1),从这里可以看出,需要两个相同的数才可以进位。或者,把ai看成二进制数,那么,ai只有一个是1,其他位上都是0,所以说,另外一个区间的数需要进位,才可以实现位数的上升。而进位,又需要两个相同的数,所以这种情况和条件相反。就是NO了。

结论
有相同的数就YES,没有相同的数就NO。

AC代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<set>
#define ll long long
using namespace std;
const int N = 200010;

int t, n, m;
set<int> hs;

int main() {
	scanf("%d", &t);
	while(t--) {
		hs.clear();
		scanf("%d", &n);
		for(int i = 1; i <= n; i++) scanf("%d", &m), hs.insert(m);
		puts(hs.size() != n ? "YES" : "NO");
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值