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

  • 相关阅读:
    ambari
    linux常用命令
    scala新版本学习(3)
    Spring中的AOP
    Spring中的Bean
    Spring的基本应用(1):依赖以及控制反转
    Scala新版本学习(2):
    python之time模块
    python之编码与解码
    爬虫之re数据提取的使用
  • 原文地址:https://www.cnblogs.com/skyh/p/13368685.html
Copyright © 2011-2022 走看看