感觉有些简单的题还是要努力想一想不可以在场上颓废QwQ
T1 笔记 note
题目大意:可以将一列数中值为x的数改成y,使得相邻两数的差的绝对值的和最小,求最小的和。n<=100000
题解:考虑每一个x,然后把值为x两侧不等于x的数字放到一个数组里面排个序取中位数。注意到元素比较小所以可以桶排。但是如果每次都桶排扫一遍复杂度退化为O(nm)的复杂度。注意到算法瓶颈是“扫一遍数组”,所以我们可以考虑只有最后一次扫一遍数组。那么对于每一个和x相邻的数不光记录他的值还记录一个下标x表示他是x旁边的数。这样把所有的x都考虑一遍即可。这样最后扫一遍即可。由于每个数字只有两个相邻的元素所以复杂度是线性的。(当然桶排可以用快排代替,可以证明对于每一段排序复杂度小于等于对总序列排序)。然而天生代码大常数QwQ。。。
T2 brackets
题目大意:有k种括号每个位置是哪种左右括号的概率已知。求序列合法的概率。n<=100
题解:
令f表示加一对括号形成合法序列的概率,g表示两段拼起来的概率。这样为了避免AB|C和A|BC的重复计算,可以规定g只能从由f形成的状态转移过来。可以用什么奇怪的理论证明。
T3 castle
题目大意:求无向图最短路网生成树计数。n<=1000
题解:首先求无向图最短路网就变成了有向无环图生成树计数。发现如果按照拓扑序来考虑到了第k个点,前k-1个点形成了一个联通块,那么k的入边一定来自这个联通块。记k-1的联通块的生成树数量为ans[k-1],那么ans[k]=ans[k-1]*d[k]。其中d[k]表示k的入度。
这是因为无论你把k接在k-1个点中的哪一个生成树的哪一个点上,都会形成树。所以答案就是所有点的入度之积。特别的,我们认为源点S=1的入度是1。