Wannafly挑战赛5

地址:https://www.nowcoder.com/acm/contest/36#question

A(前缀和)

分析:

  先求个前缀和,统计以i为右端点的区间个数,那么从左到右枚举i,对于每个i,希望找到一个j(j<i),使得s[i]-s[j]是完全平方数,因为完全平方数最多就1000个,所以我们可以枚举完全平方数来计数,时间复杂度O(10^8)

B(签到)

C(dfs)

分析:

  容易知道一个性质,如果遇见了一个环,就在这个环上无穷走,那么方差就是这个环的方差

  先预处理出能由S到达的且能到达T的点集,在上面dfs所有S->T的路径

  如果路上遇见了环,那么将环作为答案

D(数学推导)

分析:

  这题最大的问题就是如何解决容斥的问题

  我们可以定义一个S是有效字符串当且仅当T是S子序列并且字典序最小,这样在计算的时候就不会出现重复了

  具体的,我们将T的每个字符之间都画上一个空格,表示待填字符

  那么对于每个T[i],i前面那个空格里就不能填T[i],所以一共len+1个空格中,前len个都是有25种字符可以填,最后一个则是26种字符可以填

  枚举给最后一个空格的数量,计算方案数,前面len个格子就是25^x,x就是对应的不定方程的解的个数,组合数求一下就行了

E(树上路径交)

分析:

  容易发现一点,那就是以i为根的子树,删去一些边使得树高改变,那么这些边一定是从i往下的一条链,可以树形dp求出来

  那么对于每个询问,就是求一下两条树上路径的路径交

  求(a,b) (c,d) 的路径交:

    求lca(a,c) lca(a,d) lca(b,c) lca(b,d) 其中深度最深的两个点之间的路径就是交

posted @ 2017-12-13 18:21  Chellyutaha  阅读(145)  评论(0编辑  收藏  举报