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

Posted 尘封陌路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;

以上是关于Codeforces Round #682 (Div. 2)B. Valerii Against Everyone的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #436 E. Fire(背包dp+输出路径)

[ACM]Codeforces Round #534 (Div. 2)

codeforces 682C

codeforces 682D Alyona and Strings

Codeforces 682C Alyona and the Tree (树上DFS+DP)

CodeForces 682D Alyona and Strings