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 inom{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) 建这棵树,因为不存在横叉边,就不会存在这样的情况。
对于如何判断给出的环顺时针还是逆时针。
其实只需要通过叉乘求一下面积即可得出。

原文地址:https://www.cnblogs.com/skyh/p/13368685.html