B
这道题的题目很长,而且有点绕弯,大意就是有n个公主和n个王子,每个公主有一份自己满意的王子名单,n较小的公主会优先选择他的名单中没有被选走的n最小的王子,现在国王有机会让一个公主的名单多一个人,尽可能让更多公主结婚,请问能否做到,如果能,给那位公主加那位王子,如果不能直接输出Optimal
理解题意后,我们很容易就能发现,这其实只是一道简答模拟题,按顺序给每个和王子配对,标记每个王子,如果过程中有公主没有婚配就标记一下,在最后给其配一个没有结婚的王子即可,弱所有公主都婚配了,就说明已经最优,无需进一步配对
#include<stdio.h>
int p[100002],n,t,mk[100002];
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=1;i<=n;i++)mk[i]=0;
for(int i=1;i<=n;i++){
int k;scanf("%d",&k);p[i]=0;
while(k--){
int q;scanf("%d",&q);
if(!p[i]&&!mk[q])p[i]=q,mk[q]=1;
}
}bool f=0;
for(int i=1;i<=n;i++){
if(!p[i]){
int ans=0;
for(int j=1;j<=n;j++)if(!mk[j])ans=j;
printf("IMPROVE\n%d %d\n",i,ans);f=1;
break;
}
}if(!f)puts("OPTIMAL");
}
}