Codeforces Round #778 (Div. 1 + Div. 2, based on Technocup 2022 Final Round) F G题解


F. Minimal String Xoration

有两种做法:

  1. 每次确定最低位,然后像SA一样把相邻两个绑在一起,然后递归算上面的。

  2. 哈希+倍增:

    如何查询下标xor X 后一段区间的哈希值?

    可以按照线段树分成一些\(2^k\)的段,然后对于每一个\(X\)记录所有长度为\(2^0,2^1,2^2...\)的前缀哈希。查询中间的一段只需要xor上一个数,把这一段变成前缀即可。感觉这个方法比较巧妙。

G. Snowy Mountain

问题可以转变成对于每一个点,查询它能到达的最小高度点,满足这个点有高度相等的领居。

直接暴力从最小高度开始bfs即可。

复杂度分析:

假设当前枚举到了高度\(h\)

\(dp[i]\)表示到达一个高度\(\leq h\)的上述点,至少需要多少动能。

可以用\(dp[i]+1,\max(dp[i]-1,0)\)更新它的领居。

如果是\(dp[i]+1\),则领居和它的高度相同。发现对于\(h\geq\sqrt N\),最多有\(\sqrt N\)个这样的点,所以当\(h\geq \sqrt N\)时,\(dp[i]\leq \sqrt N\),每次更新会让dp[i]至少减小1。所以复杂度\(O(N\sqrt N)\),完全卡不满。

题解的分析方法:有相同高度领居的点h[i]总和最多\(N\)

相关