CF-599B - Spongebob and Joke
2 seconds
256 megabytes
standard input
standard output
While Patrick was gone shopping, Spongebob decided to play a little trick on his friend. The naughty Sponge browsed through Patrick's personal stuff and found a sequence a1, a2, ..., am of length m, consisting of integers from 1 to n, not necessarily distinct. Then he picked some sequence f1, f2, ..., fn of length n and for each number ai got number bi = fai. To finish the prank he erased the initial sequence ai.
It's hard to express how sad Patrick was when he returned home from shopping! We will just say that Spongebob immediately got really sorry about what he has done and he is now trying to restore the original sequence. Help him do this or determine that this is impossible.
The first line of the input contains two integers n and m (1 ≤ n, m ≤ 100 000) — the lengths of sequences fi and bi respectively.
The second line contains n integers, determining sequence f1, f2, ..., fn (1 ≤ fi ≤ n).
The last line contains m integers, determining sequence b1, b2, ..., bm (1 ≤ bi ≤ n).
Print "Possible" if there is exactly one sequence ai, such that bi = fai for all i from 1 to m. Then print m integers a1, a2, ..., am.
If there are multiple suitable sequences ai, print "Ambiguity".
If Spongebob has made a mistake in his calculations and no suitable sequence ai exists, print "Impossible".
3 3
3 2 1
1 2 3
Possible
3 2 1
3 3
1 1 1
1 1 1
Ambiguity
3 3
1 2 1
3 3 3
Impossible
In the first sample 3 is replaced by 1 and vice versa, while 2 never changes. The answer exists and is unique.
In the second sample all numbers are replaced by 1, so it is impossible to unambiguously restore the original sequence.
In the third sample fi ≠ 3 for all i, so no sequence ai transforms into such bi and we can say for sure that Spongebob has made a mistake.
思路:
这是一个7:43分的早晨,关于这个提交了15遍最后才过了的题,我想写点什么。
首先想先谈谈自己对CF的认识,由于不让c++和c的格式混用(刚才发现是编译器的问题),至少错了5、6次,教训是立马他妈的去学怎么用cin和cout
好了,学完回来了
然后再说说这个坑爹的题吧,首先理解题意大概就花了能有1h。。。
先说说自己理解后现在的完全抽象版:
就是有两个数列,让你对第二个数列中每个数找到在第一个数列中的位置,如果有哪一项是找不到的,用某个值给他标记出来,那么这个test就是Impossible
如果有两个值找到的pos是相同的,那么这个test的ans就是Ambiguity的
如果没什么问题,即第2个数列的所有元素都能找到唯一且存在的值,那么就输出Possible然后分别输出第二个数列每个数在第一个数列中的位置
再总结几个get的小技巧:
(1)获取某个值在一个数组中的位置,可以让value做为数组下标,然后记录数组的序号。
这个时候如果遇到序号重叠的问题,就要看看之后用到pos的量是否需要这个值
(2)判断一个数组中是否有重复的元素以及数组中各个元素的数量问题,可以专门创建一个数组来表示先前被判断数组元素的数量关系
(3)有n(n大于等于3)个要判断的可能性,可以设置n-1个bool变量,然后一次判断每种可能性
#include <iostream>
#include <cstring>
using namespace std; int main()
{
int n,m;
int f[];
int b[];
int a[];
int pos[];
int num[];
while(cin>>n>>m)
{ /*
错误一:不应该存在的代码
if(n < m) {
printf("Impossible\n");
continue;
}
*/
memset(pos,,sizeof(pos));
/*错误二:num数组忘记清零*/
memset(num,,sizeof(num));
int Im = ;
int Am = ;
/*错误三:输入的突然中止*/
for(int i = ;i <= n;i++){
cin>>f[i];
pos[f[i]] = i;
num[f[i]]++;
}
for(int i = ;i <= m;i++) {
int t;
cin>>b[i];
if(num[b[i]] > ) Am = ;
a[i] = pos[b[i]];
if(a[i] == ) Im = ;
} if(Im) {
cout<<"Impossible"<<endl;
continue;
}
else if(Am) {
cout<<"Ambiguity"<<endl;
continue;
}
else {
cout<<"Possible"<<endl;
for(int i = ;i <= m-;i++)
cout<<a[i]<<' ';
cout<<a[m]<<endl;
}
}
return ;
}
CF-599B - Spongebob and Joke的更多相关文章
- Codeforces 599B. Spongebob and Joke 模拟
B. Spongebob and Joke time limit per test 2 seconds memory limit per test 256 megabytes input standa ...
- codeforce 599B Spongebob and Joke
一道水题WA那么多发,也是醉了.f看成函数的话,其实就是判断一下反函数存不存在. 坑点,只能在定义域内判断,也就是只判断b[i].没扫一遍前不能确定Impossible. #include<bi ...
- CodeForces 599B Spongebob and Joke
简单题. #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> ...
- Codeforces Round #332 (Div. 2)B. Spongebob and Joke
B. Spongebob and Joke time limit per test 2 seconds memory limit per test 256 megabytes input standa ...
- Codeforces Round #332 (Div. 2) B. Spongebob and Joke 水题
B. Spongebob and Joke Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/599 ...
- Codeforces Round #332 (Div. 2)_B. Spongebob and Joke
B. Spongebob and Joke time limit per test 2 seconds memory limit per test 256 megabytes input standa ...
- Codeforces Round #332 (Div. 2) B. Spongebob and Joke 模拟
B. Spongebob and Joke While Patrick was gone shopping, Spongebob decided to play a little trick ...
- Codeforces Round #332 (Div. 二) B. Spongebob and Joke
Description While Patrick was gone shopping, Spongebob decided to play a little trick on his friend. ...
- CF 599D Spongebob and Squares(数学)
题目链接:http://codeforces.com/problemset/problem/599/D 题意:定义F(n,m)为n行m列的矩阵中方阵的个数,比如3行5列的矩阵,3x3的方阵有3个.2x ...
随机推荐
- nginx+keepalive主从双机热备+自动切换解决方案
环境采集cenots 6.3 64位迷你安装,因为安装前,你需要做一些工作 yum install -y make wget 如果你愿意可以更新下系统,更换下yum源. 1.安装keepalive 官 ...
- 10 Questions To Make Programming Interviews Less Expensive--reference
Conducting Interview is not cheap and costs both time and money to a company. It take a lot of time ...
- JAVA 多线程同步与互斥
1. 为什么需要互斥: 互斥操作 保证了 多线程操作的 原子性 , java的 互斥 语义 有 synchronized 关键字 提供. 主要方式 有 同步代码块 和 同步方法 两种 2. ...
- linux sudo环境变量设置
这是第一次在博客园中写自己的随笔,也是第一次使用Markdown的编辑环境,值得纪念一下!希望在以后学习linux的道路上能多多记录自己的学习心得和遇到问题的解决方法,朝着运维的方向迈出坚实的脚步. ...
- 零基础学习云计算及大数据DBA集群架构师【Linux Bash Shell编程及系统自动化2015年1月21日周四】
lvy老师教项目课程,以及代课了shell部分课程,大家都觉得这位老师不行,上课时做的操作很多都是错误的,觉得她基础不好.而且,她不能解释原因,学生问为什么,她不知道.崩溃啊.向xx培训机构反应后,说 ...
- linux下软件安装与卸载
linux上软件二进制安装主要分为:rpm手动安装和yum在线安装(其所安装的都为rpm二进制包). 关于rpm手动安装,学习后面内容前需分清如下内容: 包全名 : 操作的包是没有安装的软件包时,使用 ...
- PHP中的定界符格式
<?php //nowdoc(单引号定界符) //ABC可以是任合内容,放在单引号中 $c=<<<'ABC' 这里可以是任合内容 我是历的苛夺基 本原则叶落归根在运 输费艰难田 ...
- SQL复制表结构和数据
1.复制表结构和数据 select * into 目的数据库名.dbo.目的表名 from 原表名 select * into my0735home.dbo.infoMianTest from inf ...
- php与http协议
1.预定义变量$_SERVER $_SERVER 是一个包含了诸如头信息(header).路径(path).以及脚本位置(script locations)等等信息的数组. 可以再后台输出 f ...
- 11061160_11061151_Pair Project: Elevator Scheduler软件工程结对编程作业总结
软件工程结对编程作业总结 11061160 顾泽鹏 11061151 庞梦劼 一.关于结对编程 这次的软工任务既不是单打独斗的个人任务,也不是集思广益的团队项目,而是人数为两人的结对编程.两个人合 ...