cf 2019.04.07场
http://codeforces.com/contest/1119
第一题:没有算法,直接得结果。
第二题:
两种解法
1.二分答案,每次都要重新排序前k项,这样利用不上之前的排序信息。二分之后的排序+验证时间是n*log(n)+n。一共是n*(log(n)^2)
2.不用二分,从0开始验证,优点是可以利用之前的排序信息。排序+验证时间是n+n。一共是n^2
第三题:
我们总要在数据维度上给个先来后到逐个击破才行,dp的思想。脑子里面一开始就想全局怎么最优是很难想出来的。
一个观察是:一个大矩形的反转操作可以分解成构成他的所有2x2小矩形的反转操作的累加。因为这样除了4个角反转1次,其他的都反转2次。
所以只要大矩形反转可解,那么必然对应一个小矩形反转可解,而大矩形本身长度不限,所以小矩形可解必然大矩形可解。
于是题目可以限制成2x2小矩形操作。对于所有2x2位置p,每个p[i]必然不反转或者反转1次,重复无用。从左上角开始,该点只位于一个位置p[0],因此p[0]值得以确定,连锁反应,下一个小块位于的两个小矩形中的第一个确定后,第二份矩形是否反转也确定了。剩下的位置就是用来做验证操作的。
第四题:
题意理解了半天,然后没有理解对。。。
发现起始终止位置不重要,确定区间长度就可以了。然后怎么确定区间覆盖情况?
每个起始点都举例下一个有某个距离,这个举例其实就是该点往下覆盖长度的上限,再多的话就到了人家下一个起始点,人家去计算覆盖量就行了,自己就能终止于此了。
到达上限的用上限,不到上限的用给的区间长度,于是就要给各点的上限排序,到了的就是这些上限和,不到的就是num*len。
第五题:
一个观察:只能用两个长边+一个短边来构成三角。短边任意。
单单这个观察不足以想到最终算法,继续想怎么利用这个观察。
各个长度都摆在你面前还是难以想到最终的方法,仍然要在数据维度上分解,dp的思想。
1.假如短于此边的各种情况都给你了,怎么分配当前边?
2.假如长于此边的各种情况都给你了,怎么分配当前边?
上面两个哪个能得到最终解,或者都能,或者都不能?
答案是思路1可以得到,思路2不能得到。
思路中的“各种情况”自己分析一下的时候会发现,你只会在乎“最多形成几个三角形”。因为有了这个信息,其他的信息都能推论出来,因为新来的最大长度边不care哪些构成了三角形哪些没有,不care他的任何长度信息。
于是乎贪心就行了。