这是百度之星2011初赛B中的第一道题,题目也很水,只要找到解题思路就OK了。。

题目:

时间限制 :1000ms
描述
一个圆环上有
n
个位置,这
n
个位置按顺时针依次标号为1, 2, …,
n
。初始时圆环的每个位置上都有一个1至
n
之间的整数,且每个整数只出现一次。
任何时刻,你可以将圆环上的数全部逆时针旋转一个位置,即第
i
个位置上的数变为原来第
i
+ 1
个位置上的数,第
n
个位置上的数变为原来第1个位置上的数。也可以将圆环上的数全部顺时针旋转一个位置,即第
i
个位置上的数变为原来第
i
– 1
个位置上的数,第1个位置上的数变为原来第
n
个位置上的数。另有一个装置,可以交换圆环上第
a
个位置和第
b
个位置上的数。
下图给出了三种操作的示例,圆环上有6个位置,初始数字分别为1, 2, 4, 3, 5, 6,能交换第2个和第3个位置上的数。经过一次逆时针旋转后变为2, 4, 3, 5, 6, 1,交换后变为2, 3, 4, 5, 6, 1,再经过一次顺时针旋转后变为1, 2, 3, 4, 5, 6。
 
 

 
请问通过旋转和交换,能否使得第
i
个位置上的数正好是
i
 
输入
输入包含多组数据。
每组数据的第一行包含一个整数
n
,表示圆环上的数字个数。
第二行包含两个整数
a
,
b
(1 ≤
a
<
b
n
)
,表示可以交换圆环上第
a
个位置和第
b
个位置上的数。
接下来
n
行描述圆环上每个位置的初始值,其中第
i
行包含一个整数
ai
,表示初始时刻第
i
个位置上的数。
最后一组数据之后的一行为一个0,表示输入结束。
输出
对于每个测试用例,输出一行,如果能满足要求,这行中应只包含一个单词
Yes
,如果不能满足要求,这行中应只包含一个单词
No
样例输入
6
2 3
1
2
4
3
5
6
4
1 3
1
2
4
3
0
样例输出
Yes
No
提示
对于100%的数据,1 ≤
n
≤ 1,000

解法思路:

   首先我们定义“连通”的概念:如果在圆环中的位置可以互换,则我们认为这两个数是连通的。。。我们可以找到一个连通的一串数,则这串数中任意两个数是可以互换的。(why?自己证明把,很简单!)首先我们对每个数,找到他所属于的连通分支,然后从小到大进行排序。。。最后如果这些数能够组成连续的自然数,我们就认为这个圆环通过旋转和交换,能够使i的位置上的数是i。。

如图:

 

 

代码实现起来很容易,其实我也没写,希望有时间的同学可以写下。。。