题解:P13956 [ICPC 2023 Nanjing R] 等价重写
思路参考了官方题解。
赋值操作的特点是最终的结果只和最后一次赋值操作有关。
构造这么一张有向图
满足了这三个条件,则在原来的操作顺序下,
const int N=1e5+100;
int p[N],n,m,ans[N],lst[N];
vector<int> pos[N];
void init(int n,int m){
for(int i=1;i<=n;i++) ans[i]=i;
for(int i=1;i<=n;i++) pos[i].clear();
for(int i=1;i<=m;i++) lst[i]=0;
}
int OZDY(){
n=read();m=read();
init(n,m);
for(int i=1;i<=n;i++){
p[i]=read();
for(int j=1;j<=p[i];j++){
int u=read();
pos[i].push_back(u);
lst[u]=i;
}
sort(pos[i].begin(),pos[i].end());
}
bool Flag=false;
for(int i=2;i<=n;i++){
bool flag=true;
for(int u:pos[i]){
auto tmp=lower_bound(pos[i-1].begin(),pos[i-1].end(),u);
if (tmp!=pos[i-1].end()&&(*tmp==u)&&i==lst[u]){
flag=false;break;
}
}
if (flag){
Flag=true;
swap(ans[i],ans[i-1]);
break;
}
}
if (Flag){
printf("Yes\n");
for(int i=1;i<=n;i++)
printf("%d%c",ans[i],(i==n?'\n':' '));
}
else printf("No\n");
return Flag;
}
int main(){
int T=read();
while (T--) OZDY();
return 0;
}