CF 706div2
B
如果给的n个数字是[0,n-1]满了,输出n + k;(b = n - 1, a= n,每次操作填充的数字是(a+b+1)/2,也就是n,n;下一次操作时,b=n,a=n + 1,填充的数字是n + 1,所以和k有关)
a = mex(),b=max(),
(a+b+1)/2是已有的数字,再往下操作,a,b不变,填充的还是这个数字,输出n;
(a+b+1)/2不是已有的数字,填充,下次操作时,a,b不会改变,所以是n + 1;
#include <bits/stdc++.h>
using namespace std;
int t,n,k,x,a,b,c;
set<int> s;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> t;
while(t--){
s.clear();
cin >> n >> k;
for(int i = 0; i < n; i++){
cin >> x;s.insert(x);
}
int l = s.size();
b = *s.rbegin();
for(int i = 0; i <= b + 1; i++){
if(s.find(i) == s.end()){
a = i;
break;
}
}
if(!k) cout << l << endl;
else if(a == n && b == n - 1){
cout << n + k << endl;
}else{
c = (a + b + 1) / 2;
if(s.find(c) != s.end()){
cout << l << endl;
} else{
cout << l + 1 << endl;
}
}
}
return 0;
}