题目链接
前缀和+upper_bound()+分治
注意:不能使用lower_bound(),因为如果有很多相等的a[],它返回的是第一个的地址。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=1e5+5;
ll t,n,m,a[N],s[N];
set<ll> v;
int vis[N];
void solve(ll l,ll r){
v.insert(s[r]-s[l-1]);
ll res=(a[l]+a[r])/2;
if(res>=a[r]||res<a[l]) return ;
ll mid=upper_bound(a+l,a+r,res)-a;
//cout<<l<<' '<<r<<' '<<mid<<endl;
solve(l,mid-1);
solve(mid,r);
}
int main(){
cin>>t;
while(t--){
v.clear();
memset(vis,0,sizeof(vis));
cin>>n>>m;
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
sort(a+1,a+n+1);
for(int i=1;i<=n;i++){
s[i]=s[i-1]+a[i];
}
solve(1,n);
while(m--){
int q;cin>>q;
if(v.count(q)){
puts("Yes");
}
else puts("No");
}
}
return 0;
}