#P1148. Utopia Divided
Utopia Divided
本题没有可用的提交语言。
题目描述
美丽的乌托邦曾经饱受战争的蹂躏。当敌对行动平息后,这个国家被一条经线(南北线)和一条纬线(东西线)分成了四个区域。这两条线的交点被称为点((0,0))。这四个部分都声称自己是乌托邦,但随着时间的推移,它们通常被称为乌托邦1(东北)、乌托邦2(西北)、乌托邦3(西南)和乌托邦4(东南)。任何一个区域中的点都通过它相对于点((0,0))的向东和向北的距离来标识。这些距离可以是负数;因此,乌托邦2中的一个点由一对(负,正)的数表示,乌托邦3中的点由一对(负,负)的数表示,乌托邦4中的点由(正,负)的数表示,而乌托邦1中的点由一对正数表示。
</p>
一个主要的问题是公民不被允许跨越边界。幸运的是,一些来自乌托邦的聪明的国际信息学奥林匹克竞赛(IOI)选手开发了一种安全的传送方式。传送机器需要代码编号,每个代码编号只能使用一次。现在,这个团队以及你的挑战是,将传送器从它的初始位置\((0,0)\)引导到按要求顺序的乌托邦的各个区域。你不需要关心在一个区域中具体降落在什么位置,但你会得到一个包含\(N\)个区域编号的序列,它指定了传送器要降落的区域。你可能会被要求在连续的两个或更多的停留点降落在同一个区域。在离开初始的\((0,0)\)点后,你绝不能降落在边界上。
你将收到一个由(2N)个代码编号组成的序列,并且要将它们写成(N)个代码对的序列,在每个数字前加上一个加号或减号。如果你当前位于点((x,y))并且使用代码对((+u,-v)),你将被传送到点((x + u, y - v))。你有这(2N)个数字,并且可以按照任何你喜欢的顺序使用它们,每个数字都可以加上一个加号或减号。
假设你有代码编号(7)、(5)、(6)、(1)、(3)、(2)、(4)、(8),并且要按照区域编号序列(4)、(1)、(2)、(1)来引导传送器。代码对序列((+7,-1))、((-5,+2))、((-4,+3))、((+8,+6))可以实现这一点,因为它会按顺序将你从((0,0))传送到位置((7,-1))、((2,1))、((-2,4))和((6,10))。这些点分别位于乌托邦4、乌托邦1、乌托邦2和乌托邦1。
任务 你会得到(2N)个不同的代码编号和一个包含(N)个区域编号的序列,该序列指示了传送器要降落的位置。从给定的数字中构造一个代码对序列,以引导传送器经过给定的区域序列。
输入格式
你的程序将从标准输入读取数据。第一行包含一个正整数(N)((1 \leq N \leq 10000))。第二行包含(2N)个不同的整数代码编号((1 \leq)代码编号(\leq 100000)),它们之间用单个空格分隔。最后一行包含一个由(N)个区域编号组成的序列,每个区域编号是(1)、(2)、(3)或(4)。
输出格式
你的程序将写入标准输出。输出由(N)行组成,每行包含一对代码编号,每个编号前面都有一个符号字符。这些是将引导传送器到达给定区域序列的代码对。注意,符号后面不能有空格,但第一个代码编号后面必须有一个空格。
如果有多个解决方案,你的程序可以输出其中任何一个。如果没有解决方案,你的程序应该输出单个整数(0)。
4
7 5 6 1 3 2 4 8
4 1 2 1
+7 -1
-5 +2
-4 +3
+8 +6
来源
2002年国际信息学奥林匹克竞赛