题目描述
样例
input: 2 2 3 7 4 9 output: yes no
分析
看到位运算,想到状压。 对于一个集合中的数,1的数量比它少(指2进制)的数肯定是包含在内的。 所以只要将每个元素进行扩展,然后询问的时候只要查一下桶就可以
O
(
n
)
O(n)
O(n)解决了。 扩展的时候用记忆化解决就可以了。具体看注释吧。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std
;
const int MAXN
=1e6+10;
int t
[MAXN
],dp
[MAXN
],maxn
=0;
void dfs(int x
){
if(x
==0) return;
if(t
[x
]==1) return;
t
[x
]=1;
for(int i
=0;i
<20;i
++){
if((x
>>i
)&1){
dfs(x
^(1<<i
));
}
}
}
int main()
{
int n
,m
,x
;
scanf("%d%d",&n
,&m
);
memset(t
,0,sizeof(t
));
for(int i
=1;i
<=n
;i
++)
scanf("%d",&x
),dfs(x
);
while(m
--){
scanf("%d",&x
);
if(t
[x
]) puts("yes");
else puts("no");
}
}
END
google=咕噜咕噜