noi前第十一场 题解

A. 数

容易发现答案是

\[f_m=\sum \limits_{i=0}^n a_i[x^i](1-x)^m(1+x)^{n-m} \]

然后就有一个显然的 \(O(n^2)\) 做法,并不会优化。
一个优化的方法是,考虑 \((1-x)\)\((1+x)\) 相加为 \(2\)
所以可以将 \((1-x)\) 转化为 \(2-(1+x)\) 的形式。
这样就可以用二项式定理展开 \((2-(1+x))^m\) 这个东西。
然后发现其中一个项只与 \(m-i\) 有关,并且可以通过卷积得到。
所以卷积两次就可以得到所有答案。
另一个优化方法是用组合含义:
考虑设 \(a_i=\sum \limits_{j=0}^i b_j \binom{i}{j}\)
也就是说我们将选 \(i\) 个元素转化计数每个子集统计答案。
这样就可以将原来的集合分成四部分:
造成 \(-1\) 贡献和造成 \(+1\) 贡献,在子集中和不在子集中。
然后可以发现其中的大部分项都因为 \((1-1)^k\) 被弄没了,所以也可以两次卷积,分别求出 \(b\) 数组和最终答案。
 

B. 路

首先是第一问。
对于 \(k>0\) 的子任务,容易发现一定恰好有一条边有两个点。
推广一下是这样的,一定存在一条边 \((x,y)\),上面的顶点序列有连续的 \(x,y\)
对于任意一条最短的路径,一定仅存在一次上述即边上顶点序列包含两个顶点的情况。
所以可以枚举这种情况在哪条边的哪个位置出现,通过边上的序列不断拓展点上的序列即可。
称极短的这样的路径为 \(B\) 路径,发现这样的 \(B\) 路径两端可以分别加上 \(A\) 路径和 \(C\) 路径,大概表现为边上顶点序列比点上顶点序列少一个点。
同理可以找出所有的 \(A,C\) 路径,然后可以发现任意一条 \(AAAABCCCC空AAABCCC空B\) 的路径都是合法的,所以用 \(dp\) 合并一下即可。
 

C. 图

有这样一个做法,首先构造出一棵生成树出来,考虑每个点都向根流一个单位的流量。
然后只需要统计出环的流量减去入环的流量,得到的就是环的大小。
因为题目是平面图,所以只要在每个点上极角排序就可以通过确定区间得出了。
然而好像如果任意构造生成树,会因为父亲恰好在两条边之间,但是在环之外错掉。
然而好像如果通过 \(dfs\) 建这棵树,因为不存在横叉边,就不会存在这样的情况。
对于如何判断给出的环顺时针还是逆时针。
其实只需要通过叉乘求一下面积即可得出。

posted @ 2020-07-24 06:11  skyh  阅读(105)  评论(0编辑  收藏  举报