9.7集训 总结
今天wyc先生掳了四道题给我们... 本嘴巴AK选手吃枣药丸。
T1
题意简述:给出平面上n个点,两两连线,选尽量多的直线,使得所选直线中没有任何两条是平行的。n<=200。
sol:按斜率排序… 然而似乎有精度问题… 天师把eps设成\(10^{-6}\)就狗带了。解决方法有两个,一是用分数算,二是用叉姬(?)。
T2
题意简述:合并果子。n堆果子,每次可以选k堆合到一起。其他条件相同,求最小代价。 n<=10000。
sol:我还是too naive。根本没有吸收到NOI2015 Day2 T1的经验。搞得我做过似的… k叉哈弗曼树,补零。当且仅当\(n = p*(k-1)+1, p∈N^*\)的时候才能像二叉那么做,也就是每次选满k个合到一起。现在感觉自己真是愚蠢,每次尽量吞k个,最后的尾巴一起处理,这样怎么可能对。当n不满足上面的式子的时候,在前面补0即可。
T3
题意简述:如图。
sol:简单树形DP。N<=1000的范围,设\(f[i]\)表示传递完以i为根的子树需要的时间。贪心一下,在i的儿子中,\(f\)越大的子树要越先传递。这样,一个\(O(n^2)\)的DP就出来了。
挖坑:那N<=100000要怎么做呢。设\(f[i][0]\)表示从\(i\)传递到儿子的时间;……
T4
有一个长度未知的序列,满足如下的n个条件:至少有\(c_i\)个元素的值在区间\([a_i,b_i]\)中。求序列的最短长度。
sol:第一眼:裸上差分约束。然后想想:先把区间按左端点-右端点排序,对于第\(i\)个条件,找到最大的\(j\)使得\(a_j<=b_i\),然后尽可能地把第\(i\)个条件里的数放进这个区间里去,把第\(i+1\)个条件到第\(j\)个条件的\(c\)值都减掉\(c_i\),重复如此。很像喷泉覆盖的贪心方法。暴力\(O(n^2)\),可以过。如果二分/离散化+线段树可以做到\(O(NlogN)\)。