#include<bits/stdc++.h>
using namespace std;
int T,n,a[200001],f[200001],r[200001];
unordered_map<int,vector<int>> mp;//记录每个元素对应的索引集
int find(int u){//并查集
if(u==f[u])
return u;
return f[u]=find(f[u]);
}
void merge(int u,int v){//按秩合并
u=find(u);
v=find(v);
if(u==v)
return ;
if(r[u]<r[v])
swap(u,v);
if(r[u]==r[v])
r[u]++;
f[v]=u;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>T;
while(T--){
cin>>n;
int cnt=0,minn=200001;
mp.clear();
for(int i=1;i<=n;i++)
f[i]=i,r[i]=0;
for(int i=1;i<=n;i++){
cin>>a[i];
mp[a[i]].push_back(i);
minn=min(minn,a[i]);
}
for(auto& u:mp){
int x=u.first;
vector<int>& tmp=u.second;
if(mp.count(x+1)){//差值为1则合并索引集
for(auto& i:tmp)
merge(tmp[0],i);
merge(tmp[0],mp[x+1][0]);
}
if(x==minn)
continue;
if(mp.count(x-1)){
for(auto& i:tmp)
merge(tmp[0],i);
merge(tmp[0],mp[x-1][0]);
}
}
for(int i=1;i<=n;i++)
if(find(i)==i)
cnt++;
cout<<cnt-1<<'\n';//最终答案为连通块数量-1
}
return 0;
}