AT_abc296_c [ABC296C] Gap Existence 题解
前言
STL 大法好!
考场上做这道题,由于细节挺多,罚了几次时,终于 AC 了。
思路
若存在
所以可以用一个 bool 数组标记每一个满足
奈何,我们掐指一算,空间约
但是,我们可以使用 bitset。先介绍一下 bitset 吧:
bitset是一种类似布尔数组的结构,它的每一个元素只能是0 或1 ,但是经过优化,每个元素仅用1\text{ bit}=\dfrac{1}{8}\text{ Byte} 空间。
于是,空间最大使用为
下面是 bitset 常见的使用方法(设名称为
- 定义:
bitset<x>b,其中x 为bitset长度; - 标记:
b.set(y),其中y 为想要标记的下标; - 查看是否被标记:
b.test(z),其中z 为想要查看是否被标记的下标。
于是,我们很快就能写出代码了!时间复杂度
代码
#include<bits/stdc++.h>
using namespace std;
int n,x,l[200001]; // l 数组为题目中的 A 数组
bitset<3000000002> a; // 定义 bitset
int main()
{
cin>>n>>x;
for(int i=1;i<=n;++i)
{
cin>>l[i];
l[i]+=1000000001; // 保证为正数
a.set(l[i]); // 标记
}
for(int i=1;i<=n;++i)
{
if(l[i]+x>=0&&l[i]+x<=3000000002) // 判断,防止越界 RE
if(a.test(l[i]+x)) // 查看是否被标记
return puts("Yes"),0; // 若被标记,即满足题目要求,直接输出 Yes
}
puts("No"); // 否则输出 No
return 0;
}