首页 > 技术文章 > 模拟102

hzoi-cbx 2019-11-06 11:17 原文

A.

  单调栈,考虑每一对可行解必然是单调栈中相邻的两个点,注意处理元素相同的情况,需要存下单调栈里某一元素出现的个数,考试的时候脑抽打了hash表,然后虽然还是$O(n)$,但是T成了70。。。实际上,每个元素在单调栈里是连续的一段,因此直接用数组存一下就好。

B.  

  我思路和题解不一样,我是倒推的。

  考虑某个点i被经过了多少次,只能由两种位置转移而来:$p_{j}=i$的$j$或$i-1$。

  所以令f_{i}表示i被经过了多少次,有转移:

  $$f_{i}=\sum \frac{f_{j}}{2}[p_{j}==i]+\frac{f_{i-1}}{2}$$

  移个项 $f_{i-1}=2*f{i}-\sum f_{j}[p_{j}==i]$

  起始:$f_{n+1}=1$

  把f累加起来就是答案。然而我居然是直接除以2,没乘逆元。。。挂成40,居然有分。 

C.

  考虑每条边,处理出经过它的最长路长度,那么删去一个点后,答案就是所有最长路没有经过该点的边。

  考虑如何保证选择的边的最长路不经过这个点。

  按照拓扑序每次选出一点,将它的所有入边删去,统计答案,加入它的所有出边即可保证这一点。

推荐阅读