D - Swap Hats
题意:
给定R G B
三个字母的排序,问通过恰好
1
e
18
1e18
1e18次交换操作,能否将其变成给定的顺序?
分析:
1.令R=1,G=2,B=3
,我们可以将其转化为(1,2,3)
排列问题
2.A组的三种排列可以通过一次操作变成B组中的排列,同理,B组中的三种排列也可以通过一次操作变成A组中的排列。如果A组中的一种排列要变成他相同组中的另一种排列,需要两次操作(先变成B排列,再变回A)。综上我们可以知道:通过偶数1e18次操作,如果两种排列在同一组中,就可以得到。
延伸:
- 奇排列表示序列中逆序对为奇数的序列,偶排列表示序列中逆序对为偶数的序列。
- 奇排列可以通过一次操作变成偶排列,偶排列可以通过一次操作变成奇排列。
- 相同类型的排列相互转化要进行偶数次操作:奇排列如果变成奇排列要进行偶数次操作,偶排列如果变成偶排列要进行偶数次操作。
- 所以如果进行偶数次操作,无论如何都不能变成另一种类型的排列。
结合本题:
上图中的A组其实就是偶排列(逆序对为偶数),B组其实就是奇排列(逆序对数量为奇数)。所以题目给定
1
e
18
1e18
1e18次操作,即偶数次操作,只能在同一组中进行相互转化。所以直接判断输入的两种排列是否在同一组中。
bool f(string s)
{
return (s=="R G B"||s=="G B R"||s=="B R G");
}
int main()
{
string s1,s2;
getline(cin,s1);
getline(cin,s2);
if(f(s1)==f(s2)) puts("Yes");
else puts("No");
return 0;
}