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 682D Alyona and Strings