CF Round #500

http://codeforces.com/contest/1012

A:Photo of The Sky

题意:给你2*n个坐标,将它们变成n对二维坐标,然后用一个最小的矩形恰好包含这个n个点,问矩形最小面积是多少。’
题解:注意到答案就是(Xmax-Xmin)*(Ymax-Ymin),那么容易想到必然有一维坐标连续时面积最小。

B:Chemical table

题意:有一个n*m的周期表,当你有坐标(r1,c1),(r1,c2),(r2,c1)时可以推导出(r2,c2),现在给你q个坐标,问你还需要填多少个坐标才能推导出周期表上所有坐标。
题解:联想到图论,将其看成左边n个点右边m个点的二分图,每个坐标看成一条双向边,推导关系就等价于在同一个连通块的点之间有路径相连。那么答案就是构出的图上的连通块数量减1。

C:Hills

题意:给你n座山的高度,严格比相邻两座山高的叫做山峰,你现在可以砍掉一些山的高度,询问你得到至少有k个山峰最少要砍掉多少高度。k∈[1, n + 1 2 ]。
题解:dp[i][j][0/1/2]表示到了第i座山有j个山峰,且最后两座山的状态为00,01,10,的最小答案。

D:AB-Strings

题意:给你两个只含字符‘a’和‘b’的串s,t,你每次可以交换s和t的一个前缀,求最小的交换次数使得s串和t串一个只含有字符‘a’一个只含有字符‘b’。
题解:我们首先给两个串后面分别加上‘a’和‘b’表示两个串最后的目标字符。我们只用考虑有多少段‘a’和‘b’就可以了,那么把这个段数当做串长。当两个串都比较长我们就不停交换最靠后的两段,这样每次都是让s串和t串的总串长减2。当有一个串长为1,另一个串长大于2时,我们就从较长串移动一些到较短串,使得尽量每次操作都能让总串长度减2。

E:Cycle sort

题意:给你n个数a[1..n],你可以进行这样的操作:选择i1,i2,…in,然后a[i2]=a[i1]…a[i1]=a[in]。要求你进行最少的操作数使得这n个数为单调不降的排序,所有操作的序列长度之和不超过s。
题解:首先如果给定的数是一个排列,并且没有s这个限制,那么显然操作步数要么是1要么是2。加上s这个限制,那么考虑原来的排列由m个循环构成,一共有t个需要变的位置,那么答案是max(0,m+t-s)+min(s-t,2)。如果给定的数不是排列,s和t是定值,那么我们的目标就是让m尽可能的小,也就是让原来的序列由尽可能少的循环构成。这我们就首先当做一个排列来做,然后将那些具有相等元素的循环合并起来就好了,并查集维护就行了。复杂度是启发式合并的O(nlogn)。

猜你喜欢

转载自blog.csdn.net/qq_41884867/article/details/82153544