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

原文地址:https://www.cnblogs.com/jzssuanfa/p/6874704.html