您的位置:首页 > 其它

Codeforces Round #332 (Div. 2) B. Spongebob and Joke

2016-09-02 08:34 399 查看




题目链接:http://codeforces.com/contest/599/problem/B

题目大意:给定你一个数组a1,a2,……,am,里面的包含的是1-n的整数(可以重复),再给定一个数组f1,f2,……,fn,然后规定数组b符合b(i)=f(ai)。a数组被擦掉了,现在给定你f数组和b数组,让你判断a数组的情况。n,m(1<=m,n<=100000)。 第二行n个数表示的是f数组(1<=f(i)<=n)。第三行m个数表示的是b数组(1<=b(i)<=n)。 如果a数组存在且唯一,要求输出Possible,站一行。接下来一行输出a1,a2,……,am用空格隔开,站一行。如果a数组存在但不是唯一存在,要求输出Ambiguity。如果a数组不存在要求输出Impossible。

解题思路:首先这道题基本很多人都会认为判断f数组是否重复就是判断是否是唯一的 其实不然 这里不应该这么判断 应该去判断b数组在f数组中是唯一的 反之则说明不是唯一的 开个数组c c[f[i]]=i c[b[i]]则是a数组 这里我们要判断c[b[i]]是否等于0 因为范围是在1 到 10W之间 不包括0 初始化为0 如果它等于0 就说明它找不到一个与之相匹配的 说明不存在

//Time:108 ms
//Memory: 4720 KB
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <map>
#include <cmath>
#include <queue>
#include <string>
#include <vector>
#include <set>
#include <stack>

using namespace std;

const int maxn=100005;
bool flag1,flag2;
int n,m;
int f[maxn],b[maxn],a[maxn],c[maxn];
map<int,int> mp;
int main()
{
while(~scanf("%d %d",&n,&m))
{
flag1=true;flag2=true;
memset(a,0,sizeof(a));
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++)
{
scanf("%d",&f[i]);
c[f[i]]=i;//为了求a数组
mp[f[i]]++;
}
for(int i=1;i<=m;i++)
{
scanf("%d",&b[i]);
a[i]=c[b[i]];
if(mp[b[i]]>1)//不唯一 出现多次
flag2=false;
if(a[i]==0)//不存在的条件
flag1=false;
}
if(flag1)
{
if(!flag2)
puts("Ambiguity");
else
{
puts("Possible");
for(int i=1;i<=m;i++)
printf("%d%c",a[i],i==m?'\n':' ');
}
}
else
{
puts("Impossible");
}
mp.clear();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: