E
一道简约清新的构造题,感觉这种构造题真的很难得。
回顾题意:给定一个括号串,每次可以翻转两个相邻的相同括号,任意次,问能否将原序列变成一个 \(RBS\),并给出构造方案。
直接按原操作的角度来想是很困难的。这个时候就需要考虑:能否将操作变成一种简约,易懂的等价操作。
考虑对原串作一种视角上的变换:奇数位不变,偶数位翻转。(注意,不实际改变每个位置的元素,只是对于特定位置更换看待视角)
变换后,对于新视角下的操作就变为了:交换两个相邻的不同括号。因为任意两个相邻的位置,必然恰好由一个奇数位和一个偶数位构成,而若两个位置上的元素在原视角是相同的,则在新视角一定是不同的。而交换两个相邻的相同括号等价于未操作,但是我们视为可以交换两个相邻的相同括号。综合以上两点,其实新视角下的操作等价于可以交换任意两个相邻位置上的元素,进而等价于可以交换任意两个位置上的元素,即可以得到所有元素不变情况下的任意排列。这时的操作就变得很简约了。
于是,原问题等价于:对于含有恰好 \(x\) 个 \('('\) 和恰好 \(y\) 个 \(')'\) 的任意排序,是否存在一种排列,使得其所有偶数位翻转后是一个 \(RBS\)。
(这里主要记录一下视角转换的思考过程,感觉非常值得借鉴与复用。后面的解法就不再写了,看其他人的就行。)
code
2024ICPC南京B
这道题与去年的南京区域赛是一类题目,套路一模一样。
对原串作视角转换:将所有偶数位的 \(01\) 交换,\(2\) 不变。则原操作的“删除任意两个 \(00\) 和 \(11\)”,在新视角下便等价于删除任意两个相邻的不同数字。考虑一个很典的性质:对于同时包含 \(0\) 和 \(1\) 的 \(01\) 串,一定含有相邻的 \(01\) 或 \(10\)。于是我们发现,在新视角下,\(0\) 和 \(1\) 两种数字只会留下一个。若想让最终序列尽可能短,那么显然应该让 \(01\) 数量尽可能接近。于是 \(2\) 的转变根据 \(01\) 的数量差贪心进行即可。具体细节见代码。
code