D2 500p: CirclesCountry
简单题,枚举每两个点是否在同一圆内。
D2 1000p: Polygons2
首先将数组segments排序。对于segments[i]而言,它能组成的N边形个数=总长度大于segments[i]的前面N-1边形的个数。设状态表示为F[i][k][sum],k表示边数,则F[i][k][sum] = F[i - 1][k - 1][sum - segments[i]] + F[i - 1][k][sum]。最后对每一个i做统计得和。
D1 500p : BinaryFlips
很好的一个题目,BFS+压缩路径优化。
假如单纯用BFS,该题的复杂度是O(N*M),M代表了当前所有能到达的状态。由于在M其中许多状态都是相关联的,考虑对其作优化。
设A[a]代表了走到a状态时最少需要的步数。再建立一个双向链表维护尚未到达的状态。
当在a状态下翻K个硬币,得到的是一串新状态:l, l + 2, l + 4,...h - 2, h,那么此时就可以把l到h的序列从链表里脱链。有新序列时先寻找未到达状态序列的首地址,然后遍历一下就行了。