需要一点点的思维。
首先可以想到,编号为 i 的人最后出现的时候,便是他可能成为winner的时候,所以设定一个last数组记录每一个人最后一次出现在第几天。这是最关键的一步。
之后,只需要遍历所有人,看谁最后出现在第一天,就是第一天的winner,谁最后出现在第二天就是第二题的winner,以此类推。
唯一的问题就出在遍历这,如何做到遍历所有人,last数组开了最大的50001,print数组用来记录输出,想做到全遍历但是不开二维数组(会爆栈),可以使用一个vector保存出现过哪些人,之后再遍历vector中存储的人就行。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t;
void solve()
{
int m;
cin>>m;
int last[50001];
int print[m+1];
memset(print,0,sizeof(print));
memset(last,0,sizeof(last));
vector<int> v(0);
for(int i=1;i<=m;i++){
int n;
cin>>n;
for(int j=1;j<=n;j++){
int x;
cin>>x;
if(last[x]==0) v.push_back(x);
last[x]=i;
}
}
for(vector<int>::iterator it=v.begin();it!=v.end();it++){
//last[*it]天可以输出*it
print[last[*it]]=*it;
}
//如果 存在一天没有winner就说明可行的方案
for(int i=1;i<=m;i++){
if(print[i]==0){
cout<<-1<<endl;
return;
}
}
//存在可行方案
for(int i=1;i<=m;i++){
cout<<print[i]<<" ";
}
cout<<endl;
}
int main()
{
cin>>t;
while(t--) solve();
return 0;
}