zoukankan      html  css  js  c++  java
  • NOI Online 3 题解

    今天考了 (NOI Online 3) ,感觉很奇怪。

    (T1) 就是个很 (NC) 的贪心,随便写写就过了。

    (T2) 考试的时候竟然没有想出来,有点没懂,感觉很简单的啊,只拿了暴力 (70) 分走人。

    (T3) 出题人毕老爷再世?基本和 吉夫特 这题一模一样,直接 (3^{log_2 val}) 就可以艹过去,而且跑的蛮快,然后各位神仙们写的子集卷积有点卡常?感觉不是很懂。

    (T1)

    假设我们最后选择的是第 (i) 个瓶子,那么第 (i+1sim n) 个瓶子是没法对它产生贡献的。

    由于 (A_i) 是非负的,所以我们考虑让尽可能多的瓶子对答案产生贡献。

    然后可以发现,和 (i) 的距离大于 (k) 的瓶子没法产生贡献(没法走到 (i) ),其余的,我们从距离为 (k) 的点开始,直接一带一路,可以发现都能对答案产生贡献。

    所以我们求一个前缀和,每个位置的答案就是 (sum_i - sum_{max(0,i-k-1)})

    所有位置的答案取个 (max) 就是我们要求的结果。

    (T2)

    我们定义一个 (a imes b) 的矩阵 (A) 和一个 (b imes c) 的矩阵 (B) 相乘,得到一个 (a imes c) 的矩阵 (C) ,其中 (C) 满足:

    [C_{i,j} = oplus_{k=1}^{b} A_{i,k} imes B_{k,j} ]

    我们设 (E) 为该图的邻接矩阵,其大小为 (n imes n)

    我们再设 (G)(1 imes n) 的矩阵,其中 (G_{1,i}) 表示第 (i) 个点的初始答案。

    那么显然,进行了 (k) 次操作以后,答案就是 (G imes E^k)

    然后我们就得到了一个暴力的做法:每次直接快速幂求出 (E^k) ,时间复杂度为 (O(qn^3log k))

    这东西显然是过不去的,考虑优化。

    我们先求出所有的 (E^{2^i}) ,这一部分的时间复杂度为 (O(n^3log k)) 。然后对 (k) 进行二进制拆分,每次将 (G) 乘上一个 (E^{2^i}) 。由于 (G)(1 imes n) 的,所以每次乘时间复杂度为 (O(n^2)) ,最多乘上 (log k) 次,所以单次查询时间复杂度为 (O(n^2log k))

    所以总复杂度降为 (O(n^3log k + qn^2log k)) ,可以通过全部的测试点。

    (T3)

    考虑优秀子序列的限制是什么。

    可以发现,如果存在某一位,满足子序列中有至少 (2) 个值该位为 (1) ,那么一定是不合法的。

    所以一个优秀子序列,一定是满足每一位至多有一个数为 (1)

    我们设 (f_T) 表示有多少个优秀子序列所有数的异或和为 (T) (容易发现它们的和此时也为 (T) )。

    我们枚举每一个数作为子序列的结尾,考虑怎么转移。可以发现此时转移到的 (T) 一定是 (val_i) 的超集,转移方程为:

    [f_T += f_{Toplus val_i} ]

    最后的答案就是 (sum_{T} f_T imes varphi(1 + T)) ,由于 (varnothing) 没有被纳入考虑,所以我们还要在加上 (1)

    (k = log_2^{mx\_val}) ,那么直接这样做是可以被卡到 (n2^k) 的。

    我们考虑将相同的数合并起来,那么转移方程就变为了:

    [f_T += f_{Toplus val_i} imes cnt_{val_i} ]

    需要注意的是,当 (val_i=0) 时,我们需要单独处理,此时 (f_0 = 2^{cnt}-1) ,同时 (f_T,T>0) 需要乘上 (2^{cnt})

    此时的时间复杂度就变成了 (3^k) ,实测在卡满的情况下,只需要 (1s) 即可。

    关于时间复杂度的证明

    我们优化后,总的计算量为: (sum_{i=0}^k inom{n}{i} 2^{n-i})

    然后这东西根据二项式定理可知为 (3^k)

  • 相关阅读:
    第四章 方法(4.2 方法的嵌套调用)
    C#利用for循环打印图形练习题
    第三章 C#程序结构 (3.3 循环结构)
    第六章 数组和索引器 (6.6 索引器)
    第五章 类与对象 5.2 猫类(案例二)
    第五章 类与对象 5.1 时间类(案例一)
    第三章 C#程序结构[3.2 选择结构的应用(Windows窗体应用程序)(四)]
    第三章 C#程序结构(3.1 顺序与选择结构)
    第二章 C#语法基础 (2.2 C#语言的运算符和表达式)
    第二章 C#语法基础(2.1C#语言的数据类型二)
  • 原文地址:https://www.cnblogs.com/TheShadow/p/12951324.html
Copyright © 2011-2022 走看看