提交时间:2023-12-13 15:53:26

运行 ID: 24198

#include <iostream> #include <cstdio> #include <math.h> #include <algorithm> #include <istream> #include <string> #include <queue> #include <deque> #include <random> #include <stack> #include <set> #include <string.h> #include <map> #include <unordered_map> #include <sstream> #include <bitset> #include <fstream> #include <climits> #include <time.h> #include <cassert> using namespace std; #define endl "\n" #define int long long #define double long double #define pii pair<int, int> #define p1(x) (x).first #define p2(x) (x).second #define lc(x) ((x) << 1) #define rc(x) ((x) << 1 | 1) #define i128 __int128_t set<int>S[100300]; int n; int mn[100300],cmn[100300]; signed main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); //freopen("tribool.in","r",stdin); //freopen("tribool.out","w",stdout); int t; cin>>t; while(t--){ cin>>n; memset(mn,0x3f,sizeof(mn)); memset(cmn,0x3f,sizeof(cmn)); int res=1e9; for(int i=1;i<=n;i++){ int p=0; cin>>p; S[i].clear(); int w=p; while(p--){ int x; cin>>x; S[i].insert(x); } for(int x:S[i]){ if(mn[x]>S[i].size())cmn[x]=mn[x],mn[x]=S[i].size(); else if(cmn[x]>S[i].size())cmn[x]=S[i].size(); } if(w>S[i].size())res=min(res,(int)S[i].size()+1); } for(int i=1;i<=n;i++){ vector<int>f; for(int x:S[i]) if(mn[x]==S[i].size())f.push_back(cmn[x]); else f.push_back(mn[x]); sort(f.begin(),f.end()); int ct=0; for(int x:f) ct++,res=min(res,x+ct); } cout<<res<<endl; } cout.flush(); return 0; }