#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 1e6 + 5;
struct Node{
int val, id;
bool operator < (const Node &x) const{
return val < x.val;
}
}a[maxn];
int cnt[maxn];
void solve(){
int k, i, j, c;
cin >> k;
int n = 0;
for(i = 1; i <= k; i++){
cnt[i] = 0;
cin >> c;
for(j = 1; j <= c; j++){
int x;
cin >> x;
a[++n] = {x, i};//把所有集合都放在一个数组里
}
}
sort(a + 1, a + n + 1);//排序
j = 1;
int tot = 0;//当前区间包含几个集合的元素
int res = 1e18;
//双指针
for(i = 1; i <= n; i++){
while(j <= n && tot < k){
int id = a[j].id;
if(!cnt[id]){
tot++;
}
cnt[id]++;
j++;
}
if(tot >= k){
res = min(res, a[j - 1].val - a[i].val);
}
cnt[a[i].id]--;
if(!cnt[a[i].id]) tot--;
}
cout << res << '\n';
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int T;
cin >> T;
while(T--){
solve();
}
return 0;
}
给定k个集合,每个集合选一个数,求所选数的最大值和最小值值差的 最小值
最新推荐文章于 2024-06-12 10:00:23 发布