线段树内二分一定要注意先左后右。。。不要同时
A. Reverse
题解:
只能倒置一次,所以贪心的从头开始遍历数组。如果当前元素之后有更小的,则在此处倒置。数据范围只有500,枚举每个倒置情况取字典序最小的即可。复杂度O(t*n2)。
B. Odd Swap Sort
题解:
可以发现有贪心的顺序,即每次把当前最小的元素放置到最左边,类似于冒泡。但由于加和为奇数才能移动,所以若之前出现过奇偶性相同的较大元素,则移动失败。因此建立一个优先队列(小根堆)保存以下当前最小元素,遍历数组操作即可。
C. Inversion Graph
题解:
逆序对连边问题。顺序遍历,发现若存在i<j<k且ai>aj>ak,则aj与ai连边后即无用了。因为后面与位置j形成逆序关系的位置都可以与i形成逆序,从而与位置j相关。因此维护一个单调递增的a数列即可,每次向前找最靠前位置的逆序关系,再修改a数列使其缩短并将该最靠前位置的a权值改为寻找过程中最大的a值即可。答案为最终a数列的长度。
D. Big Brush
题解:
模拟题。发现最终一定是涂色一个2*2矩阵,因此不妨倒着涂色,每次对已涂色区域的边缘做dfs。发现有如下四种可涂色情况:
- 2*2矩阵最终颜色相同
- 2*2矩阵有3处最终颜色相同,剩下的一处已被涂色(注意:此处已涂色指倒涂色顺序)
- 2*2矩阵有2处最终颜色相同,其余两处已被涂色(同上)
- 2*2矩阵中有3处已被涂色(同上)
另外的,要注意2*2矩阵的选取又可以以当前dfs位置分别为左上、右上、左下、右下的4种情况。分类讨论以下既可通过。
E. Colorful Operations
题解:
数据结构题。区间修改单点查询,就是线段树模板的修改版。总体上,可以设置一个数组bi表示当前颜色i的操作2更改权值代数和,每次操作1对树上节点权值进行 +b[当前颜色]-b[修改颜色] 即可,这样对应的操作3答案即为线段树上对应叶子节点权值 +b[该位置颜色] 。我们将连续的颜色相同片段视为整体,对于每个操作1,最多额外产生两个“整体”。对于其合并整体的情况,我们发现每个整体自产生后只能被合并一次。所以我们对“整体”的操作是线性的。因此对于操作1,我们顺序按整体操作即可(即区间修改颜色和树上节点权值),这里用到线段树内二分,线段树外二分会多一个log从而超时。