地址: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) 其中深度最深的两个点之间的路径就是交