Coder-Strike 2014

转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove

Qualification Round


Round 1

D:想像一下DFS序,但是输出是反向的


E:直接按@把串分成一段段的,然后以@为中心往两边找。


Round 2

C:贪心,肯定先把常规题目先做完,因为常规题目的分数是不变的。然后根据动态分数的是,从高到低做。

可以这么思考,如果从小到大,每个动态分数都能达到,那就是不断翻倍。如果某个动态分数达不到,不能翻倍,只能取那么多分的话,我们当然是希望这样的题目先做,保证基数增大,后面的翻倍才会更有效。


D:状态压缩DP,有效的序列肯定是一个递减序列,而这样的序列只存在于末端,而且长度肯定 < k,就可以状压了。

比如说 8,2,4,2,不管之后是怎样的序列,第一个2不可能被合并了,而前面的8肯定也没有用了,所以有效部分只是4,2。那么dp[i][j]表示前i项,末端的递减状态序列状态为j。


E:线段树,对于区间[l , r]记录一个2 * 2的矩阵,保存从一端到另一端的4种情况的最短路径。合并的话应该很好做,直接枚举。查询的时候,不断递归,有些子区间会重复计算,所以记忆化一下。


Finals

A:有11个字符是对称的,搞出来后就没了。。。


B:首先有一些人本来就在的,先要处理一下。

之后大概就是,进去的时候,本来已经有人了,那么肯定不是leaders,走的时候,里面还有人,那么也肯定不是leaders。

然后要考虑一些特殊情况,进去的时候,里面只有本身一个人,那么说明其它人(除了压根没有出现的人)都不是leaders。走的时候里面没有人了,那么也说明其它人(除了压根没有出现的人)都不是leaders。


C:统计每个人被赞同多少次,排序之后就是不断维护一个前缀和。最后再枚举被同一个人赞同的两个人。


D:暴力平衡树来模拟整个移动过程是可以的。

线段树也是可以做的,将1-m这些位置 空出来,定义原先的位置为[m + 1 , n + m],那么就避免了移动过程。

我们只需要维护区间有多少个位置不是空的就可以找到相应的第y个位置。移动的话,就是在当前位置-1,然后在1-m里相应向前插入就OK了。

然后记录已知的杯子的位置 ,以及某个位置 已经确定是哪个杯子。可以判断是否冲突。

如果用BIT来维护的话,是需要二分得到第y个位置的。


E:给的坐标不是非常大,所以击打的次数有限的。枚举每一次击打,如果这次击打要落在某个圆内的话,我们可以得到这条射线的夹角范围。那么将这些时间点排序之后就成了区间覆盖次数最多的了。

要么就讨论的详细点,因为是一个环,可能有些区间要分成两段,然后作区间覆盖。

总之就是细节要注意一下。



code : https://github.com/cxlove/ACM_ICPC/tree/master/Contest/Codeforces/Coder-Strike_2014

你可能感兴趣的:(ACM_比赛题解)