加载中...

cf div2 1051 E(视角转换,构造+思维)

E

一道简约清新的构造题,感觉这种构造题真的很难得。

回顾题意:给定一个括号串,每次可以翻转两个相邻的相同括号,任意次,问能否将原序列变成一个 \(RBS\),并给出构造方案。

直接按原操作的角度来想是很困难的。这个时候就需要考虑:能否将操作变成一种简约,易懂的等价操作

考虑对原串作一种视角上的变换:奇数位不变,偶数位翻转。(注意,不实际改变每个位置的元素,只是对于特定位置更换看待视角

变换后,对于新视角下的操作就变为了:交换两个相邻的不同括号。因为任意两个相邻的位置,必然恰好由一个奇数位和一个偶数位构成,而若两个位置上的元素在原视角是相同的,则在新视角一定是不同的。而交换两个相邻的相同括号等价于未操作,但是我们视为可以交换两个相邻的相同括号。综合以上两点,其实新视角下的操作等价于可以交换任意两个相邻位置上的元素,进而等价于可以交换任意两个位置上的元素,即可以得到所有元素不变情况下的任意排列。这时的操作就变得很简约了。

于是,原问题等价于:对于含有恰好 \(x\)\('('\) 和恰好 \(y\)\(')'\) 的任意排序,是否存在一种排列,使得其所有偶数位翻转后是一个 \(RBS\)

(这里主要记录一下视角转换的思考过程,感觉非常值得借鉴与复用。后面的解法就不再写了,看其他人的就行。)

code

另一种解法,也是非常不错的思路:

对于序列中的任意 \("(("\)\("))"\),可以看作它们能在序列中任意移动(只需手玩即可证明)。考虑构造 \(RBS\),显然左括号尽可能往左放,右括号尽可能往右放最好,并且由操作知二者还可以互相转换。用栈处理原串,找到所有 \("(("\)\("))"\),剩余的串必须只能是 \("()()()"\) 或者是 \(")()()("\) 的形式。为了最终匹配成功,上述 \("(("\)\("))"\) 的数量必须是偶数,以能够平均左右各放一半。还有一些需要注意的小细节,见代码即可。

code2

2024ICPC南京B

这道题与去年的南京区域赛是一类题目,套路一模一样。

对原串作视角转换:将所有偶数位的 \(01\) 交换,\(2\) 不变。则原操作的“删除任意两个 \(00\)\(11\)”,在新视角下便等价于删除任意两个相邻的不同数字。考虑一个很典的性质:对于同时包含 \(0\)\(1\)\(01\) 串,一定含有相邻的 \(01\)\(10\)。于是我们发现,在新视角下,\(0\)\(1\) 两种数字只会留下一个。若想让最终序列尽可能短,那么显然应该让 \(01\) 数量尽可能接近。于是 \(2\) 的转变根据 \(01\) 的数量差贪心进行即可。具体细节见代码。

code

posted @ 2025-09-19 14:52  jxs123  阅读(10)  评论(0)    收藏  举报