2019.09.13【NOIP提高组】模拟 A 组

T1:这题其实不难。

我们考虑在dfs序上dp。设f[i][j]表示到dfs序上的第i个点时,1~i经过了j条左边的方案数。

那么转移有两种情况:

1、在i下面加上一个左儿子,则转移到f[i+1][j+1]

2、从i往上走,走到第一个没有右儿子的点,然后加上这个点的有儿子,这样的话就转移到f[i+1][j-1](因为一定是少一条左边)

最终的答案是f[n*2-1][0],因为一定要走到最右的儿子整棵树才算构造完成。

T2:这题其实也不难,比赛时别被卡SPFA。

推一下式子可以发现每一条边的权值变化是有周期的,那么这就是一个分层SPFA。

但是SPFA会被卡,所以要么用dij,要么加上判断dis[对头]是否小于dis[队尾]的优化(这个优化看上去不起眼,但是在这一题中十分有用)。

总结:在比赛时如果SPFA有被卡的风险,那么就尽量用dij。因为SPFA的时间复杂度不稳定。

T3:这题有一点复杂。

首先要注意到子序列是可以不连续的。

首先我们设c[i]表示满足长度为i的权值最小的某个子序列。那么可以证明c[i]\inc[i+2]。也就是说i+2的答案子序列一定是有i的子序列加上两个数得到的。这个结论我暂时还不会证。

那么现在就有一个分治的做法。首先假设我们算出了l~mid和mid+1~r的所有长度的答案,现在我们要求l~r的所有长度的答案。

可以设在l~mid中我们选出了s1个数,在mid+1~r中我们选出了s2个数,此时我们就可以更新l~r中s=s1+s2的答案。但是枚举s1和s2的效率是n^2的,此时我们就用到了刚才的结论。

假设s的最优解是s1和s2,那么在算s+1时,我们只需要用s1-2+s2+3,s1-1+s2+3,s1+s2+1,s2+1+s2,s1+2+s2-1来更新即可。因为波动不超过2。

实际上,对于每个区间我们都要维护区间的每个长度的最大值和最小值,这时为了合并时使用。这样维护所有长度的答案看上去是n^2的,实际上是nlogn的,这个想一想就明白了。

发布了149 篇原创文章 · 获赞 24 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/chiyankuan/article/details/100902284