Codeforces 599 B Spongebob and Joke

14 篇文章 0 订阅

传送门:
http://codeforces.com/problemset/problem/599/B
题意:
给出序列f[i]和f[a[i]],要求还原序列a[i]

不就是记录一下ans[f[i]]=i,然后再去求ans[f[a[i]]]不就是a[i]了么
那么在具体判断的过程中,肯定是先判断卷是不是
impossible,再判断是不是无穷,最后再记录一下答案不就ok了么
刚开始还在纠结n和m的大小问题,感觉其实大可不必,只需要按照样例的判断方法去判断一下,照着套路去写应该就可以了
炸了,Wrong on test10,53
姿势太不优美了,刚开始是ambiguity判断错了,我是一旦f序列有相同的元素就判ambiguity,但实际上这个序列中m的大小是可能小于n的,所以说应该判断b序列中实际出现的值在f中是不是有多次,所以说之前那样写就把本应该possible 的值判成了ambiguity,然后改的时候,手残居然把b打成了f,哎,真应该再仔细看一看改过后的代码啊!!!

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int n,m;int f[maxn],b[maxn],ans[maxn];int vis[maxn];
int main(){
    scanf("%d%d",&n,&m);
    int flag=0;
    for(int i=1;i<=n;i++){
        scanf("%d",&f[i]);
        if(ans[f[i]]>0||ans[f[i]]==-1){
            ans[f[i]]=-1;continue;
        }
        ans[f[i]]=i;
    }
    for(int i=1;i<=m;i++){
        scanf("%d",&b[i]);
    }
    for(int i=1;i<=m;i++){
        if(ans[b[i]]==0) return puts("Impossible");
    }
    for(int i=1;i<=m;i++){
     if(ans[b[i]]==-1)
      return puts("Ambiguity");
    }   
    puts("Possible");
    for(int i=1;i<=m;i++){
        printf("%d ",ans[b[i]]);
    }
    printf("\n");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值